首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python lxml从XML文档中获取多个元素

使用Python lxml从XML文档中获取多个元素
EN

Stack Overflow用户
提问于 2021-01-30 19:59:21
回答 1查看 27关注 0票数 0

来自下面的XML文档:

代码语言:javascript
复制
   <ns:getCommonNamesFromTSNResponse xmlns:ns="http://itis_service.itis.usgs.gov">
    <ns:return xmlns:ax21="http://data.itis_service.itis.usgs.gov/xsd" xmlns:ax23="http://metadata.itis_service.itis.usgs.gov/xsd" xmlns:ax26="http://itis_service.itis.usgs.gov/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax21:SvcCommonNameList">
    <ax21:tsn>183833</ax21:tsn>
    <ax21:commonNames xsi:type="ax21:SvcCommonName">
    <ax21:commonName>African hunting dog</ax21:commonName>
    <ax21:language>English</ax21:language>
    <ax21:tsn>183833</ax21:tsn></ax21:commonNames>
    <ax21:commonNames xsi:type="ax21:SvcCommonName">
    <ax21:commonName>African Wild Dog</ax21:commonName>
    <ax21:language>English</ax21:language>
    <ax21:tsn>183833</ax21:tsn></ax21:commonNames>
    <ax21:commonNames xsi:type="ax21:SvcCommonName">
    <ax21:commonName>Painted Hunting Dog</ax21:commonName>
    <ax21:language>English</ax21:language>
    <ax21:tsn>183833</ax21:tsn>
    </ax21:commonNames>
    </ns:return>
    </ns:getCommonNamesFromTSNResponse>

我希望使用Python lxml库获得"commonName“和"language”元素的所有值。

我试过这段代码:

代码语言:javascript
复制
import lxml.etree as ET
tree = ET.parse("names.xml")
namespaces = {'ax21': 'http://data.itis_service.itis.usgs.gov/xsd'} 
common_names = tree.findall(".//ax21:commonNames:ax21:commonName", namespaces)
langs = tree.findall(".//ax21:commonNames:ax21:language", namespaces)

但它只返回空列表。

有什么提示吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-30 20:07:54

Case1:使用find分别获取每个标签

代码语言:javascript
复制
lan = tree.find('.//ax21:language', namespaces)
cn = tree.find('.//ax21:commonName', namespaces)
print(lan.text)
print(cn.text)

输出:

英语

非洲猎犬

如果你需要全部的话

代码语言:javascript
复制
langs = tree.findall(".//ax21:commonName", namespaces)
[i.text for i in langs]
['African hunting dog', 'African Wild Dog', 'Painted Hunting Dog']

如果您同时需要这两个,那么我们可以使用[\[xpath]]1`2

代码语言:javascript
复制
a=tree.xpath('.//ax21:language |.//ax21:commonName',namespaces= {'ax21': 'http://data.itis_service.itis.usgs.gov/xsd'} )
[i.text for i in a]

Output:
['African hunting dog',
 'English',
 'African Wild Dog',
 'English',
 'Painted Hunting Dog',
 'English']

在最后一种情况下,简单地在xpath中提供名称空间变量是不够的,我们应该以namespaces= {'ax21': 'http://data.itis_service.itis.usgs.gov/xsd'}格式提供它

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65967687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档