在Mac OS和Linux主机之间计算的lxml.etree.xpath元素不一致

时间:2013-12-12 06:41:29

标签: python xpath lxml

这个问题让我困惑了一段时间。我试图从金融网站刮取表格。例如,来自barchart.com(finviz.com同样的问题)

import lxml.html as lh
import lxml, urllib2

gList = ['gapup','gapdown']
count = {}
doc = {}
for g in gList:
    doc[g] = lh.parse(urllib2.urlopen('http://www.barchart.com/stocks/{0}.php'.format(g)))
    count[g] = len(doc[g].xpath('/html/body//table[4]//tr'))

基本上,我在计算表中有多少行(股票)。在我的Macbook上(Python 2.7.5+ lxml 3.2.4)。完美的作品:

In [14]: count
Out[14]: {'gapdown': 101, 'gapup': 34}

但是,当我在dreamhost网站上远程测试相同的代码时。不会起作用:

In [7]: count
Out[7]: {'gapdown': 0, 'gapup': 0}

最初,我认为这是因为Dreamhost上的Python 2.6和2.6已知具有较少的xpath支持。所以我今天安装pyenv使用2.7.5。问题仍然存在。

我试图使用这段代码(我称之为xpath relay :)):

In [11]: len(doc['gapup'].xpath('/html/body//table')[3].xpath('//tr'))
Out[11]: 43

如数字所示(43!= 34),没有用。使用lh.tostring(),我意识到它基本上拾取了html文件中的所有tr-s。没有接力。

我是xpath的新手。但是为什么相同的代码不能在不同的机器上使用相同的python 2.7 + lxml 3.2.4设置?非常感谢!

1 个答案:

答案 0 :(得分:1)

我能够使用Python 2.7.3在Ubuntu 12.04主机上重现该问题。

由于某种原因,该表有时是第五个表。无论如何,在解析HTML文档时,最好不要依赖计数元素,但如果给出则使用@id属性。

使用XPath表达式//table[@id="dt1"]//tr我可以在我的Ubuntu主机上获得可重现的结果。