我正在做一个项目,我必须根据 URL 解析 20 个不同的 HTML 页面,我想从所有页面中获取一些信息。页面具有不同的结构,所需信息位于每个站点的不同位置。
我想我可以试试 Python lxml 模块。由于可以在每个站点的不同位置找到信息,而且我很懒惰将 20 * X 不同的 reg.表达式,我认为对这些元素使用绝对 XPath 是个好主意。通过这种方式,我可以简单地利用 Chrome 浏览器的复制 XPath 功能,并为我的解析器提供每个 HTML 元素的清晰路径,我不需要编写很多代码。
我找不到任何示例来说明如何在 Python 中引用具有绝对 XPath 的 HTML 元素。一些评论说最好使用相对路径而不是绝对路径,但并没有真正解释原因。但同样,使用其相对 XPath 引用元素意味着再次进行一些编码工作。
这 20 个站点是 unicode 的,这让情况变得更加复杂。
有没有办法在 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,但是当我使用绝对 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
最佳答案
您正在使用 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()
关于Python:基于绝对XPath解析HTML元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16367504/