XPath不适用于屏幕抓取

时间:2015-10-13 19:10:05

标签: python web-scraping beautifulsoup scrapy screen-scraping

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

我试图从下面的图像中获取94,218,但我使用的XPath和CSS无效。

enter image description here 它来自此页面:https://fancy.com/things/280558613/I%27m-Fine-T-Shirt

我已尝试使用Scrapy多个XPath和CSS,但所有内容都返回空白。

以下是一些例子:

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()")

我已经尝试过Firebug,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>]

谢谢!

1 个答案:

答案 0 :(得分:3)

此处的问题是,提供的网址返回的HTML中包含格式错误的<a>标记:

<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()

我使用&#34;的原因包含&#34;是因为类名(对我来说)的名称末尾带有一个空格,因此Scrapy对"a[@class='fancyd_list']"的检查会失败,因为"fancyd_list" != "fancyd_list " < / p>