XPath 不适用于屏幕抓取

XPath not working for screen scraping

我正在使用 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 开发工具和不同的插件,但是 none 的 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>]

谢谢!

这里的问题是所提供的 URL 返回 HTML,其中包含以下格式错误的 <a> 标记:

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

这里的第一行在右括号之前包含一个 /,根据 HTML 标准,它表示 <a> 标记的完成。由于Scrapy,<a>元素已经完成,你无法获取标签之外的文本。

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

对于此示例,您可以使用的另一个选项是通过类似于以下内容的方法自行修复 HTML:

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

然后您可以通过

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

我使用 "contains" 的原因是因为 class 名称(对我而言)在其名称末尾出现了 space,因此 Scrapy 的检查"a[@class='fancyd_list']" 的将失败,因为 "fancyd_list" != "fancyd_list "