我正在尝试开始使用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>
答案 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]")