获取lxml中标签内的所有文本

107 投票
15 回答
126912 浏览
提问于 2025-04-16 09:33

我想写一段代码,能够提取出所有在<content>标签里的文字,包括代码标签里的内容。对于下面这三种情况,我都想抓取到。我试过用tostring(getchildren()),但这样会漏掉标签之间的文字。我在查找API的时候也没找到合适的函数。你能帮我一下吗?

<!--1-->
<content>
<div>Text inside tag</div>
</content>
#should return "<div>Text inside tag</div>

<!--2-->
<content>
Text with no tag
</content>
#should return "Text with no tag"


<!--3-->
<content>
Text outside tag <div>Text inside tag</div>
</content>
#should return "Text outside tag <div>Text inside tag</div>"

15 个回答

92

你需要的功能是不是可以用 text_content() 来实现呢?

106

只需要使用 node.itertext() 这个方法,像这样:

 ''.join(node.itertext())
50

试试这个:

def stringify_children(node):
    from lxml.etree import tostring
    from itertools import chain
    parts = ([node.text] +
            list(chain(*([c.text, tostring(c), c.tail] for c in node.getchildren()))) +
            [node.tail])
    # filter removes possible Nones in texts and tails
    return ''.join(filter(None, parts))

举个例子:

from lxml import etree
node = etree.fromstring("""<content>
Text outside tag <div>Text <em>inside</em> tag</div>
</content>""")
stringify_children(node)

结果是:'\n标签外的文本 <div>标签内的文本 <em>这里面</em> 标签</div>\n'

撰写回答