【问题标题】:XPath not working for screen scrapingXPath 不适用于屏幕抓取
【发布时间】:2016-01-11 16:19:11
【问题描述】:

我正在将 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 可以工作,但它们不包含文本,所以看起来像这样:&lt;a href="#" class="fancyd_list "/&gt;&lt;/a&gt;

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

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

谢谢!

【问题讨论】:

  • 这种类型的解析总是让我抓狂。使用beautiful soup,我敢打赌这将是微不足道的。
  • 嘿,谢谢@RobertB 会给出一个破解,远离它,因为我听说性能不是最好的
  • 嘿@RobertB 刚刚尝试了 BeautifulSoup 并遇到了同样的问题

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


【解决方案1】:

这里的问题是,提供的 URL 返回的 HTML 带有格式错误的&lt;a&gt; 标记,如下所示:

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

此处的第一行在右括号之前包含一个/,根据HTML 标准,这表示&lt;a&gt; 标记的完成。由于对于 Scrapy,&lt;a&gt; 元素已完成,您无法获取标签之外的文本。

之前使用 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 "

【讨论】:

  • 你先生是个传奇。谢谢!
  • 我是 Python/Scrapy 的初学者,它的返回:\n -1\n 有没有简单的方法来提取 1?
  • 如果它返回一个列表,从列表中取出你想要的项目并使用.strip() 去掉前导/尾随空格。那应该只留下数字(作为字符串)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 2014-05-22
  • 2010-12-02
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多