以下是使用lxml
和xpath
处理预期文本可能被单个节点包含的情况的方法。
from lxml import etree
xml = """
<html>
<h1>Title</h1>
<div id="target">
<div>Some <div><div><span><b>text</b></span></div></div></div>
<div>Some <b>another text</b></div>
<p>Some <i>text</i> different than <div>before</div></p>
<em>Some text</em>
</div>
</html>
"""
root = etree.fromstring(xml)
# 使用xpath表达式查找符合条件的元素
ele = root.xpath('//div[@id="target"]//*[(./text()="Some " and .//*[1]/text()="text") or ./text()="Some text"]')
print(ele)
在xpath表达式中,.//*[1]/text()="text"
用于查找当前上下文节点的第一个后代节点是否包含预期的字符串。这个匹配是大小写敏感的,因此./text()="some "
将找不到任何匹配项。
对于给定示例,输出结果如下:
[<Element div at 0x7f2d65eef6c0>, <Element p at 0x7f2d65eef700>, <Element em at 0x7f2d65eef740>]
从找到的元素中提取内容
print([[t for t in e.xpath('descendant-or-self::text()')] for e in ele])
输出结果:
[['Some ', 'text'], ['Some ', 'text', ' different than ', 'before'], ['Some text']]