我正在开发一个项目,我必须根据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
答案 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()