为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

倚天杖 2022-03-09 20:12:18
我需要在一些 HTML 字符串模板中<div>找到id="XXX":from lxml import htmltemplate = '''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版本:>>> pythonPython 3.7.3>>> pip show lxmlVersion: 4.3.4
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

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


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>

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


查看完整回答
反对 回复 2022-03-09
  • 1 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信