我需要在一些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>
现在由比我聪明的人来解释为什么我们需要诉诸这个......