代码之家  ›  专栏  ›  技术社区  ›  maurobio

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

  •  0
  • maurobio  · 技术社区  · 5 年前

    从以下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>
    

    我想使用pythonlxml库获取“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)
    

    但它只返回空列表。

    有什么提示吗?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Ajay    5 年前

    案例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 ]] 1 ` 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变量是不够的,我们应该在xpath中提供它 namespaces= {'ax21': 'http://data.itis_service.itis.usgs.gov/xsd'} 格式