lxml:解析html,无法获取节点

时间:2014-09-21 10:27:20

标签: python xpath lxml

我正在尝试开始使用lxml解析html。我从基本的xpath知道/应该选择根节点,//body应该选择dom中的body元素节点,等等。但是我得到了所有这些节点的空列表。

from lxml import html
import urllib2
headers =  {'User-agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0'}
req = urllib2.Request("http://news.ycombinator.com", None, headers)
r = urllib2.urlopen(req).read()
x = html.fromstring(r)
x.xpath("/")
[]

编辑:

例如,这是该页面的另一个有效的xpath表达式,它返回一个空列表

x.xpath("/html/body/center/table/tbody/tr[3]/td/table/tbody/tr[1]/td[3]")
[] 
# when it should have returned the following (as of this time)
# <td class="title"><a href="http://www.tomdalling.com/blog/modern-opengl/opengl-in-2014/">OpenGL in 2014</a><span class="comhead"> (tomdalling.com) </span></td>

1 个答案:

答案 0 :(得分:1)

关于你的第二个问题:xpath表达式的问题可能是tbody-element。 您已经可以在Stackoverflow上找到类似问题的多个问题 - 例如这里是Why do browsers insert tbody element into table elements?Why does firebug add <tbody> to <table>?,简称 是浏览器添加像,例如头部和tbody到源代码中的DOM, 所以xpath不会匹配。你可以省略tbody:

x.xpath("/html/body/center/table/tr[3]/td/table/tr[1]/td[3]")

这似乎与此处所述的一样:Extracting lxml xpath for html table

但我赞成在Python lxml XPath problem的第一个答案中给出的方法,   - 如果您只是省略了不必要的xpath部分并将查询缩短到您正在寻找的元素,它也应该有效,所以不是

x.xpath("/html/body/center/table/tbody/tr[3]/td/table/tbody/tr[1]/td[3]")

你应该用

得到结果
x.xpath("/html/tr[3]/tr[1]/td[3]")