python - 将 root.xpath() 与正则表达式一起应用会返回 lxml.etree._ElementUnicodeResult

标签 python regex html-parsing lxml

我正在生成一个模型来找出一段文本在 HTML 文件中的位置。

因此,我有一个数据库,其中包含来自不同报纸文章的大量数据,其中包括标题、发布日期、作者和新闻文本等数据。我想做的是通过分析这些数据,生成一个模型,该模型可以自行找到包含此内容的 HTML 标记的 XPath。

问题是当我在 xpath 方法中使用正则表达式时,如下所示:

from lxml import html

with open('somecode.html', 'r') as f:
    root = html.fromstring(f.read())

list_of_xpaths = root.xpath('//*/@*[re:match(.,"2019-04-15")]')

这是在代码中搜索发布日期的示例。它返回 lxml.etree._ElementUnicodeResult 而不是 lxml.etree._Element。

不幸的是,这种类型的元素不允许我在应用 root.getroottree().getpath(list_of_xpaths[0]) 后像 lxml.etree._Element 一样获取它所在位置的 XPath.

有没有办法获取这种类型元素的 XPath?怎么办?

有没有办法让 lxml 与正则表达式返回 lxml.etree._ElementUnicodeResult 元素?

最佳答案

问题是您得到一个表示为 _ElementUnicodeResult 类实例的属性值

如果我们反射(reflection) _ElementUnicodeResult 类提供的内容,我们可以看到它允许您通过 .getparent() 方法获取具有此属性的元素:

attribute = list_of_xpaths[0]
element = attribute.getparent()

print(root.getroottree().getpath(element))

这将为我们提供元素的路径,但由于我们还需要属性名称,因此我们可以这样做:

print(attribute.attrname) 
<小时/>

然后,为了获得指向元素属性的完整xpath,我们可以使用:

path_to_element = root.getroottree().getpath(element)
attribute_name = attribute.attrname

complete_path = path_to_element + "/@" + attribute_name
print(complete_path)

仅供引用,_ElementUnicodeResult 还通过 .is_attribute 属性指示这实际上是否是一个属性(因为此类也表示文本节点和尾部)。

关于python - 将 root.xpath() 与正则表达式一起应用会返回 lxml.etree._ElementUnicodeResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55752413/

相关文章:

python - 扩展解包不会在列表中创建单独的项目

python - 使用 Opencv SIFT 时 matches1to2 出错

python - 我可以在 python 中 "fake"一个包(或至少一个模块)用于测试目的吗?

java - 简化复杂的正则表达式

javascript - Regex Javascript(必须有 1 个数字和字符)

javascript - 使用 cheerio 查找和替换某些属性

python - Ubuntu 上的 Matplotlib 错误 "cannot import name pyplot"

mysql - 区分大小写

php - 解析网站的 URL

Python:如何向 re.sub() 的替换参数添加计数器