我正在使用Scrapy进行屏幕抓取项目,并且遇到XPath问题。
我试图从下面的图像中获取94,218,但我使用的XPath和CSS无效。
它来自此页面: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>]
谢谢!
答案 0 :(得分:3)
此处的问题是,提供的网址返回的HTML中包含格式错误的<a>
标记:
<a href="#" class="fancyd_list "/> # Malformed HTML, <a> tag closes here
94,218
</a>
此处的第一行在结束括号之前包含/
,按HTML标准表示<a>
标记已完成。从Scrapy开始,<a>
元素已完成,您无法在标记之外获取文本。
以前使用BeautifulSoup的建议可能是一个好主意,因为它可以更好地处理格式错误的HTML 更多。
此示例的另一个选项是通过类似于:
的方式自行修复HTMLnew_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>