2015-10-13 166 views
2

我正在使用Scrapy进行屏幕抓取项目,并且遇到XPath问题。XPath不能用于屏幕抓取

我想从下面的图像中获得94,218,但我用过的XPath和CSS不起作用。

enter image description here 这是从这个页面:https://fancy.com/things/280558613/I%27m-Fine-T-Shirt

我已经试过多次的XPath和CSS与Scrapy但一切都返回空白。

下面是一些例子:

response.xpath('/html/body/div[1]/div[1]/div[1]/aside/div[1]/div/div/a[2]/text()').extract() 

response.xpath('//*[@id="sidebar"]/div[1]/div/div/a[2]/text()').extract() 

response.xpath('//*[contains(concat(" ", @class, " "), concat(" ", "fancyd_list", " "))])'.extract() 

response.xpath(".//*[@id='sidebar']/div[1]/div/div/a[2]/text()") 

我试过萤火虫,Firepath,Chrome浏览器开发工具和不同的插件,但没有的XPath或CSS似乎工作..有人可以帮助?

实际网页上的代码是:

<a href="#" class="fancyd_list "/> 
    6 
</a> 

一些的XPath的工作,但他们不包含文本,所以它看起来是这样的:<a href="#" class="fancyd_list "/></a>

我使用BeautifulSoup也试过,但它有同样的问题:

print soup.find_all('a',class_='fancyd_list') 
[<a class="fancyd_list " href="#"></a>, <a class="fancyd_list " href="#"></a>] 

谢谢!

+0

这种类型的解析总是让我疯狂。使用'美丽的汤',我敢打赌这将是微不足道的。 – RobertB

+0

嘿谢谢@RobertB会给出一个破解,远离它,因为我听到的表现并不是最好的 – bnussey

+0

嘿@RobertB只是试过BeautifulSoup并得到了同样的问题 – bnussey

回答

3

这里的问题是,所提供的URL将在下面带有格式错误<a>标签返回HTML:

<a href="#" class="fancyd_list "/> # Malformed HTML, <a> tag closes here 
    94,218 
</a> 

在这里,第一行包含一个/之前关闭托架,其通过HTML标准指示完成<a>标签。从Scrapy开始,<a>元素完成后,您无法获取标签之外的文本。

以前使用BeautifulSoup的建议在这里可能是一个好主意,因为它可以更好地处理格式错误的HTML 太多

另一种选择,你可以有这样的例子是解决自己的HTML,通过类似于:通过

new_body = re.sub(r'<a href="#" class="fancyd_list "/>', '<a href="#" class="fancyd_list ">', response.body) 
response = response.replace(body=new_body) 

然后,您将能够从响应选择

response.xpath("//div[@class='frm']/div[@class='figure-button']/a[contains(@class, 'fancyd_list')]/text()").extract() 

我使用“包含”的原因是因为类名(对于我)在其名称末尾出现空格,因此Scrapy的"a[@class='fancyd_list']"检查将失败,因为"fancyd_list" != "fancyd_list "

+0

您先生是一个传奇。谢谢! – bnussey

+0

我是一个Python/Scrapy初学者,它的回归: '\ n -1 \ n' 有没有简单的方法来提取1? – bnussey

+1

如果它返回一个列表,从列表中取出你想要的项目,并使用'.strip()'去除前导/尾随空白。这应该让你只有数字(作为一个字符串)。 – Rejected