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

标签 python html parsing xpath absolute

我正在做一个项目,我必须根据 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/

相关文章:

python - 在Python中的defaultdict中使用levenshtein距离作为键

javascript - 使用符合内容安全策略的代码替换多个内联按钮 onclick 事件处理程序

javascript - 右对齐输入

python - 使用 python 从获取的 HTML 代码中提取特定信息

javascript - 尝试解析 xml 文件以进行 javascript 测验

javascript - Python:如何访问网页,单击特定链接并将其中的数据复制到文本文件?

python - 使用 np.nans 从 python 数据框中选择数据部分

html - 为什么 div 内的嵌套跨度不遵循该 div 的行高规则?

javascript - Jquery HTML 表本身

python - Cython -std=c++11 错误,同时使用 C 和 C++