获取lxml中标签内的所有文本
我想写一段代码,能够提取出所有在<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'