Python:基于绝对XPath解析HTML元素

时间:2013-05-03 21:02:28

标签: python html parsing xpath absolute

我正在开发一个项目,我必须根据URL解析20个不同的HTML页面,我想从所有这些页面获取一些信息。页面具有不同的结构,所需信息位于每个站点的不同位置。

我以为我可以试试Python lxml模块。由于信息可以在每个站点的不同位置找到,我很懒惰将20 * X不同的注册表放在一起。表达式,我认为对这些元素使用绝对XPath是个好主意。通过这种方式,我可以简单地利用Chrome浏览器的复制XPath功能,并为我的解析器提供每个HTML元素的清晰路径,而且我不需要编写很多代码。

我找不到任何显示我如何在Python中使用绝对XPath引用HTML元素的示例。一些评论说,而不是绝对路径,最好使用相对,但不能真正解释原因。但同样,引用具有相对XPath的元素意味着一些编码再次起作用。

只是为了让这20个网站变得更加复杂。

有没有办法在Python中引用带有绝对XPath的HTML元素,并像这样取回它的文本值?

/html/body/div[1]/table/tbody/tr[2]/td[2]/table/tbody/tr/td[2]/div/table/tbody/tr[3]/td[2]/table/tbody/tr[2]/td/table/tbody/tr/td[2]/font/b

...它将返回HTML元素的文本值。

到目前为止,我得到了以下代码,它适用于相对XPath,但是当我使用绝对值时,它会给出下面的错误。

import urllib2
from lxml import html
from bs4 import UnicodeDammit


response = urllib2.urlopen('http://oneofthesites.com')
content = response.read()
doc = UnicodeDammit(content, is_html=True)
parser = html.HTMLParser(encoding=doc.original_encoding)
root = html.document_fromstring(content, parser=parser)
data = root.find('/html/body/div[1]/table/tbody/tr[2]/td[2]/table/tbody/tr/td[2]/div/table/tbody/tr[1]/td[2]/b').text_content()
print(data)

,错误是:

SyntaxError: cannot use absolute path on element

也许我的基本概念是错误的,所以欢迎任何关于如何处理这些页面的其他想法!

感谢您的帮助, g0m3z

1 个答案:

答案 0 :(得分:5)

您正在使用html.document_fromstring();这将返回Element,而不是ElementTree对象。绝对路径仅支持后一种类型。

您有两种选择:

  • 使用html.parse(response)(注意,不是response.read()的结果);这会返回一个合适的树对象。

  • 使用相对XPath表达式。只需将/html替换为.;顶级元素在所有<html>标记之后,其余部分与该元素相关:

    data = root.find('./body/div[1]/table/tbody/tr[2]/td[2]/table/tbody/tr/td[2]/div/table/tbody/tr[1]/td[2]/b').text_content()