使用lxml解析XML时,遇到另一个子节点无法获取文本
我正在解析一个从网上下载的XML文件,使用的是lxml
这个库。这个文件的结构大概是这样的:
<root>
<a>Some text in A node</a>
<b><c>Some text in C node</c>Some text in B node</b>
</root>
我想用下面这段代码来打印节点里的文本:
from lxml import etree
doc = etree.parse('some.xml')
root = doc.getroot()
for ch in root:
print ch.text
输出结果
Some text in A node
None
但是这段代码没有打印出<B>
里的text
,这是为什么呢?当我把XML文件的结构改成下面这样,先是text
,然后是子节点时,我得到了正确的输出。这是和XML的语法有关,还是lxml
的问题呢?因为我无法控制这个XML文件的格式,因为它是直接从网上下载的,所以我需要一种方法来获取之前格式中的文本。
<root>
<a>Some text in A node</a>
<b>Some text in B node<c>Some text in C node</c></b>
</root>
输出结果
Some text in A node
Some text in B node
1 个回答
3
text
属性会返回第一个子元素之前的文本。如果没有文本,它的值就是None。
要打印标签中的第一个文本,可以尝试以下方法,这里使用了xpath来获取子文本节点:
for ch in root:
print next((x for x in ch.xpath('text()')), None)
或者:
for ch in root.xpath('/text()'):
print ch