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

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


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 id="XXX">XXX content</div>如果我用另一个包裹<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>之后添加一些<div id="XXX">:


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也不会匹配,但我可以忍受


请告诉我,如果该问题与 XPath 无关lxml,而是与 XPath相关


PSBeautifulSoup没有这个问题,即使使用与lxml解析器相同的模块,它甚至不匹配next\n


版本:


>>> python

Python 3.7.3


>>> pip show lxml

Version: 4.3.4


倚天杖
浏览 165回答 1
1回答

翻翻过去那场雪

看起来有时只需要使用蛮力: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>现在由比我聪明的人来解释为什么我们需要求助于这个......
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python