【问题标题】:XPath from Chrome results in an empty list in scrapyChrome中的XPath导致scrapy中的空列表
【发布时间】:2015-05-30 11:15:33
【问题描述】:

我正在通过 Chrome 开发工具检查页面,并在页面上有元素的 xpath。我故意禁用了 javascript,因此 DOM 不会被更改。然而,xpath I Chrome 给出的元素结果为scrapy 中的[],尽管该元素当然存在。可能是什么问题?

特别是xpath //*[@id="prddeatailed_container"]/table[1]/tbody/tr[1]/td/div/table/tbody/tr[2]/td[1]/span这个http://cheaptool.ru/product/sadovyj-pylesos-billy-goat-lb351/——价格29990。

$ scrapy shell 'http://cheaptool.ru/product/sadovyj-pylesos-billy-goat-lb351'

In [2]: xp1 = '//*[@id="prddeatailed_container"]/table[1]/tbody/tr[1]/td/div/table/tbody/tr[2]/td[1]/span'

In [3]: aaa = response.xpath(xp1)

In [4]: aaa
Out[4]: []

更新: 结果在结果 html 中没有 tbody。为什么 Chrome 会在 xpath 中显示它?如何让它成为xpath中真正的html?

【问题讨论】:

  • 你为什么不直接使用://span[@class="totalPrice"]
  • @user3616725,问题不是用什么,而是为什么不行。
  • 也许读过Scrapy manual?特别是:永远不要使用完整的 XPath 路径,使用基于属性或任何识别特征的相对和聪明的路径...永远不要在 XPath 表达式中包含 <tbody> 元素,除非你真的知道你在做什么'正在做

标签: python google-chrome python-2.7 xpath scrapy


【解决方案1】:

既然你提到了tbody,很多HTML不遵循使用tbody的规则,通常Chrome会通过自动添加tbody来修复它。如果您打印响应 HTML,您将找不到任何 tbody

【讨论】:

    【解决方案2】:

    “我故意禁用了 javascript,所以 DOM 不会被改变”

    除了 javascript,DOM 也可以更改,因为浏览器通常具有修复 html 源的算法,以便浏览器可以很好地呈现它。

    “@user3616725,问题不是用什么,而是为什么不行”

    常见的情况是你在我写这个答案时发现的,Chrome 自动添加了<tbody> 标签。有关此行为的说明,请参阅以下讨论:

    Why does my XPath query (scraping HTML tables) only work in Firebug, but not the application I'm developing?

    “结果html中竟然没有tbody。为什么Chrome在xpath中显示出来了?如何让它成为xpath中真正的html?”

    Chrome 渲染的 html 结果确实有<tbody>,这就是 Chrome 在 xpath 中显示它的原因。 Chrome 开发工具适用于可能与实际 HTML 源不同的最终 DOM,因此您根本不能依赖 Chrome 中的 xpath 在 Scrapy 中使用。

    【讨论】:

      猜你喜欢
      • 2021-11-24
      • 1970-01-01
      • 2021-12-20
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多