使用lxml/ElementT获取非连续文本

2024-09-30 01:25:35 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这样的HTML,我需要使用lxml/ElementTree从中选择“text2”:

<div>text1<span>childtext1</span>text2<span>childtext2</span>text3</div>

如果我已经将div元素作为mydiv,那么mydiv.text文件只返回“text1”。在

使用itertext()似乎是有问题的,或者最多也很麻烦,因为它会在div下遍历整个树

有没有简单/优雅的方法从元素中提取非第一个文本块?在


Tags: 文件textdiv元素htmllxmlspanelementtree
3条回答

这样的文本将位于元素子元素的tail属性中。如果元素在elem中,则:

elem[0].tail

将为您提供元素中第一个子元素的尾部文本,在您的例子中是您要查找的"text2"。在

嗯,lxml.etree提供完整的XPath支持,允许您处理文本项:

>>> import lxml.etree
>>> fragment = '<div>text1<span>childtext1</span>text2<span>childtext2</span>text3</div>'
>>> div = lxml.etree.fromstring(fragment)
>>> div.xpath('./text()')
['text1', 'text2', 'text3']

{{sram>属性中的任何子节点都不在cdllam>中。在

例如,以下是提取节点中所有文本块的最简单方法:

html = '<div>text1<span>childtext1</span>text2<span>childtext2</span>text3</div>'

import lxml.html    # ...or lxml.etree as appropriate
div = lxml.html.fromstring(html)

texts = [div.text] + [child.tail for child in div]
# Result: texts == ['text1', 'text2', 'text3']
# ...and you are guaranteed that div[x].tail == texts[x+1]
# (which can be useful if you need to access or modify the DOM)

如果为了防止texts可能包含空字符串而牺牲该关系,则可以使用以下方法:

^{pr2}$

我还没有用普通的stdlib ElementTree测试过这个,但它也应该可以用它来工作。(当我看到shaneholloway的lxml专用解决方案时,我才想到这一点)我更喜欢lxml,因为它对HTML的视频同步有更好的支持,而且我通常已经为lxml.html.clean安装了它

相关问题 更多 >

    热门问题