使用 Python lxml 从 XML 文档中获取多个元素
Getting several elements from XML document using Python lxml
来自下面的 XML 文档:
<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”元素的所有值。
我试过这段代码:
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)
但它 returns 只是空列表。
有什么提示吗?
案例 1:使用 find
分别获取每个标签
lan = tree.find('.//ax21:language', namespaces)
cn = tree.find('.//ax21:commonName', namespaces)
print(lan.text)
print(cn.text)
输出:
英语
非洲猎犬
如果你需要全部
langs = tree.findall(".//ax21:commonName", namespaces)
[i.text for i in langs]
['African hunting dog', 'African Wild Dog', 'Painted Hunting Dog']
如果您同时需要它们,那么我们可以使用 [\[xpath
]]`2
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 中提供 namesapce 变量是不够的,我们应该以 namespaces= {'ax21': 'http://data.itis_service.itis.usgs.gov/xsd'}
格式提供它
来自下面的 XML 文档:
<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”元素的所有值。
我试过这段代码:
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)
但它 returns 只是空列表。
有什么提示吗?
案例 1:使用 find
分别获取每个标签lan = tree.find('.//ax21:language', namespaces)
cn = tree.find('.//ax21:commonName', namespaces)
print(lan.text)
print(cn.text)
输出:
英语
非洲猎犬
如果你需要全部
langs = tree.findall(".//ax21:commonName", namespaces)
[i.text for i in langs]
['African hunting dog', 'African Wild Dog', 'Painted Hunting Dog']
如果您同时需要它们,那么我们可以使用 [\[xpath
]]
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 中提供 namesapce 变量是不够的,我们应该以 namespaces= {'ax21': 'http://data.itis_service.itis.usgs.gov/xsd'}
格式提供它