使用lxml解析XML时,遇到另一个子节点无法获取文本

2 投票
1 回答
817 浏览
提问于 2025-04-19 08:35

我正在解析一个从网上下载的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

根据lxml.etree._Element的文档

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

撰写回答