Python解析XML:获取指定节点下所有子节点的值
用Python解析XML获取指定节点下所有子节点的值
嘿,这事儿好办!咱直接用Python标准库自带的xml.etree.ElementTree就能搞定,不用额外装第三方包,省心又靠谱。
先把你给的XML内容整理完整(补全了截断的部分,不影响解析逻辑):
<abstract> <title>摘要</title> <p>Amphinomids(俗称火蠕虫)是海洋环节动物的基干类群,其特征是具有防御性背侧钙质刚毛,接触时会脱落。长期以来有假说认为Amphinomids具有毒性,会利用刚毛注入有毒物质。然而,从形态学或分子角度研究火蠕虫毒液的研究十分匮乏,至今未发现毒腺,也未在分子水平上鉴定出任何毒素。为探究该问题,我们分析了三种火蠕虫的转录组——<italic>Eurythoe complanata</italic>, <italic>Hermodice carunculata</italic>的内容</p> </abstract>
下面是具体的解析代码,我给你写了两种场景:解析字符串形式的XML,以及解析本地XML文件,你按需用就行。
场景1:解析字符串形式的XML
import xml.etree.ElementTree as ET # 定义你的XML字符串(如果是从其他地方获取的,直接替换就行) xml_content = """ <abstract> <title>摘要</title> <p>Amphinomids(俗称火蠕虫)是海洋环节动物的基干类群,其特征是具有防御性背侧钙质刚毛,接触时会脱落。长期以来有假说认为Amphinomids具有毒性,会利用刚毛注入有毒物质。然而,从形态学或分子角度研究火蠕虫毒液的研究十分匮乏,至今未发现毒腺,也未在分子水平上鉴定出任何毒素。为探究该问题,我们分析了三种火蠕虫的转录组——<italic>Eurythoe complanata</italic>, <italic>Hermodice carunculata</italic>的内容</p> </abstract> """ # 解析XML root = ET.fromstring(xml_content) # 指定要获取子节点的目标节点(这里<abstract>是根节点,直接用root就行;如果目标节点不是根,用root.find('节点名')) target_node = root # 遍历目标节点的所有直接子节点,获取每个子节点的完整文本值 child_values = [] for child in target_node: # .text只能获取节点开头的文本,用ET.tostring可以拿到节点下所有文本(包括子节点的文本),然后解码成字符串 full_text = ET.tostring(child, encoding='utf-8', method='text').decode('utf-8').strip() child_values.append((child.tag, full_text)) # 输出结果 for tag, value in child_values: print(f"节点<{tag}>的值:{value}")
运行这段代码后,你会得到:
节点<title>的值:摘要 节点<p>的值:Amphinomids(俗称火蠕虫)是海洋环节动物的基干类群,其特征是具有防御性背侧钙质刚毛,接触时会脱落。长期以来有假说认为Amphinomids具有毒性,会利用刚毛注入有毒物质。然而,从形态学或分子角度研究火蠕虫毒液的研究十分匮乏,至今未发现毒腺,也未在分子水平上鉴定出任何毒素。为探究该问题,我们分析了三种火蠕虫的转录组——Eurythoe complanata, Hermodice carunculata的内容
场景2:解析本地XML文件
如果你的XML是存在本地文件(比如abstract.xml)里的,代码可以改成这样:
import xml.etree.ElementTree as ET # 加载并解析XML文件 tree = ET.parse('abstract.xml') root = tree.getroot() target_node = root # 同样,这里<abstract>是根节点,直接用root # 后续逻辑和场景1完全一样 child_values = [] for child in target_node: full_text = ET.tostring(child, encoding='utf-8', method='text').decode('utf-8').strip() child_values.append((child.tag, full_text)) for tag, value in child_values: print(f"节点<{tag}>的值:{value}")
小提示
- 如果你的目标节点不是根节点,比如要找某个深层节点,用
root.find('父节点/子节点')或者root.findall()来定位就行。 - 要是XML里有命名空间,记得提前处理命名空间映射,不然会找不到节点哦~
内容的提问来源于stack exchange,提问作者Scientist_jake
相关产品推荐
相关产品推荐

