来自Chrome的XPath会在scrapy中生成一个空列表

时间:2015-03-26 12:28:28

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

我正在通过Chrome开发工具检查页面,并在页面上显示元素的xpath。我故意禁用javascript,因此DOM不会被更改。但是,xpath I Chrome在scrapy中为元素提供了[],当然,元素存在。可能是什么问题?

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

$ 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?

2 个答案:

答案 0 :(得分: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开发工具适用于最终DOM,可能与实际的HTML源不同,因此您无法依赖Chrome中的xpath在Scrapy中使用。

答案 1 :(得分:0)

由于您提及tbody,许多HTML都不遵循使用tbody的规则,并且Chrome通常会通过自动添加tbody来修复它。如果您打印回复HTML,则找不到任何tbody