gpt4 book ai didi

python-3.x - 使用 XPath,选择没有文本兄弟的节点

转载 作者:行者123 更新时间:2023-12-03 16:08:46 24 4
gpt4 key购买 nike

我想用python3和lxml提供的HTML解析器提取一些HTML元素。

考虑这个 HTML:

<!DOCTYPE html>
<html>
<body>
<span class="foo">
<span class="bar">bar</span>
foo
</span>
</body>
</html>

考虑这个程序:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from lxml import html
tree = html.fromstring('html from above')
bars = tree.xpath("//span[@class='bar']")
print(bars)
print(html.tostring(bars[0], encoding="unicode"))

在浏览器中,查询选择器“span.bar”仅选择 span 元素。这就是我所渴望的。但是,上述程序会产生:
[<Element span at 0x7f5dd89a4048>]
<span class="bar">bar</span>foo

看起来我的 XPath 实际上并不像查询选择器,并且在 span 元素旁边拾取同级文本节点。如何调整 XPath 以仅选择 bar 元素,而不选择文本“foo”?

最佳答案

注意 lxml 中的 XML 树模型(以及在标准模块 xml.etree 中)具有 tail 的概念.所以位于 a.k.a following-sibling 之后的文本节点元素的数量将存储为 tail那个元素。所以你的 XPath 正确返回 span元素,但根据树模型,它有 tail其中包含文本'foo'。

作为一种解决方法,假设您不想进一步使用树模型,只需清除 tail打印前:

>>> bars[0].tail = ''
>>> print(html.tostring(bars[0], encoding="unicode"))
<span class="bar">bar</span>

关于python-3.x - 使用 XPath,选择没有文本兄弟的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48990592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com