我需要在某些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
答案 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>
现在由比我聪明的人来解释为什么我们需要诉诸于此...