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

时间:2019-06-19 18:21:33

标签: python xpath lxml

我需要在某些HTML字符串模板中找到SELECT SUM(pt.psum) AS tsum FROM (SELECT SUM(money) AS psum FROM table1 WHERE money > 0 GROUP BY id UNION ALL SELECT SUM(payment) AS psum FROM table2 WHERE money > 0 GROUP BY id UNION ALL SELECT SUM(pay) AS psum FROM table3 WHERE money > 0 GROUP BY id) pt <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有关

P.S。 lxml不会出现此问题,即使使用与解析器相同的BeautifulSoup模块,它甚至不匹配下一个lxml

版本:

\n

1 个答案:

答案 0 :(得分: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>

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