防止 lxml 选择匹配元素之后的下一个文本节点



我需要在一些HTML字符串模板中找到带有id="XXX" <div>

from lxml import html
template = '''
Text node 1
<div id="XXX">XXX content</div>
Text node 2
'''
tree = html.fromstring(template)
element = tree.get_element_by_id('XXX')
result = html.tostring(element).decode('utf-8')
print(result)
>>> <div id="XXX">XXX content</div>
>>> Text node 2

出于一些奇怪的原因,它选择<div>和下一个Text node 1


如果我用另一个<div>包装<div id="XXX">XXX content</div>

Text node 1
<div>
    <div id="XXX">XXX content</div>
</div>
Text node 2

一切都更好,它打印匹配的<div id="XXX">和空行(解码n(:

>>> print(result)
<div id="XXX">XXX content</div>
n

如果我在<div id="XXX">后添加一些<div>

Text node 1
<div id="XXX">XXX content</div>
<div></div>
Text node 2

一切都更好,它打印匹配的<div id="XXX">和空行(解码n(:

>>> print(result)
<div id="XXX">XXX content</div>
n

以前的Text node 1从未受到影响 - 至少这很好(

那么,是否可以指定某些内容不选择下一个文本节点?如果n也不匹配,那会很棒,但我可以忍受

请告诉我,如果这个问题与lxml无关,而是与一般的XPath有关

附言 BeautifulSoup没有这个问题,即使使用与解析器相同的lxml模块,它甚至不匹配下一个n

版本:

>>> python
Python 3.7.3
>>> pip show lxml
Version: 4.3.4

看起来有时只需要使用蛮力:

tree = html.fromstring(template)
element = tree.get_element_by_id('XXX')
element.tail = None #brute force in action....
result = html.tostring(element).decode('utf-8')
print(result)

输出所需的

<div id="XXX">XXX content</div>

现在由比我聪明的人来解释为什么我们需要诉诸这个......

最新更新