• Python ElementTree的find,findall函数参数


    这两天学习如何使用微软的一个API,用python写了接口代码使用HTTP方法测试,HTTP的API的最后返回是一个XML文件,翻了翻,看见python的xml的ElementTree这套接口的API看起来比较对胃口,于是使用了一下ElementTree进行解析

    但死活用find,和findall两个函数接口服务得到希望的tag,百思不得其借,

    Python的docamention上面对这两个函数,解释非常简单。

    find(match)

    Finds the first subelement matching match. match may be a tag name or path. Returns an element instance or None.

    回家找了一下《Python Essential Reference》国内翻译《Python参考手册》,手册的解释太简单,其参数match含义其实挺复杂的。

    其有tag,* .//tag,tag1/tag2,*/tag等不同的用法,文档上根本没有说明白。不知道是不是因为ElementTree 是一个外家的孩子,在本家不受待见还是因为是effbot自己提交的文档,文档写的马虎了。

    有兴趣的去 http://effbot.org/zone/element.htm 翻翻,比docamention 上面讲的清楚明白一些。

    废话不多说,用代码解释这两个函数。

    xml_str="""
    
    <a>
    
        <b>1</b>
    
        <b>2</b>
    
        <c>
    
            <d>
    
                <b>3</b>
    
                <b>4</b>
    
            </d>
    
            <e>
    
                <b>5</b>
    
                <b>6</b>
    
            </e>
    
        </c>
    
    </a>
    
    """
    
    tag = xml.etree.ElementTree.fromstring(xml_str)
    
    print "find a-----------------------------------------------------"
    
    find_tag = tag.findall("a")  #自己是搜索不到
    
    print find_tag
    
    print
    
    find_tag = tag.findall("*")  #找打text为1,2的b和C
    
    print find_tag
    
        
    
    print "find b-----------------------------------------------------"    
    
    find_tag = tag.findall("b")     #找到 text 为 1,2的b
    
    print find_tag
    
    for item in find_tag:
    
        print item,item.text 
    
    print 
    
    find_tag = tag.findall(".//b")  #找到  text 为 1,2,3,4,5,6 的b
    
    print find_tag
    
    for item in find_tag:
    
        print item,item.text 
    
      
    
    print "find d-----------------------------------------------------"     
    
    find_tag = tag.findall("d")    #不是A的子节点,这样搜索不到。
    
    print find_tag
    
    print
    
    find_tag = tag.findall("c/d")  #到达d的路径,path不包括当前节点
    
    print find_tag
    
    print
    
    find_tag = tag.findall(".//d") #使用.//前缀,从当前节点寻找所有的下方节点
    
    print find_tag
    
    print
    
    print "find path . *-----------------------------------------------------"
    
    tag_c = tag.find(".//c")         #从C开始找
    
    find_tag = tag_c.findall(".//b") ##找C下面所有层次找b,找到  text 为 3,4,5,6 的b
    
    print find_tag
    
    for item in find_tag:
    
        print item,item.text 
    
    find_tag = tag_c.findall("*/b") #找到C,D下面一层所有tag为b的数据 ,也是找到  text 为 3,4,5,6 的b
    
    print find_tag
    
    for item in find_tag:
    
        print item,item.text 
    
    print "xml namespace -----------------------------------------------------"
    
    xml_str="""<a xmlns="http://www.w3.org/TR/html4" >
    
        <b>1</b>
    
    </a>
    
    """
    
    tag = xml.etree.ElementTree.fromstring(xml_str)
    
    find_tag = tag.findall("*")  #如果有xml命名空间,那么所有所有的tag都有名字空间的uri,如上这个tag字符串是 {http://www.w3.org/TR/html4}b 而不是b
    
    print find_tag
    
    倒霉的是,这几个暗礁怎么都让我碰上了。
     
    【可以在标明作者和出处的情况下的完整转载,不得用于盈利和商业用途,否则每字1元,每图100,不降价,对百度文库,360doc加价一倍】
  • 相关阅读:
    java java.lang.NoClassDefFoundError 的解决办法
    jdbc.properties 包含多种数据库驱动链接的版本
    regex正则表达式
    针对谷歌默认最小字体12px的正确解决方案 (css、html)
    有关svn的报错
    芝麻圆表
    微信 公众号开发文档接口都是后台去请求。
    一级和二级的列表在一起的时候。获取一级放在轮播里面展示。10个一组轮播
    移动端的搜索用的是from提交
    h5中不能用js来直接获取网络码和机器码的。
  • 原文地址:https://www.cnblogs.com/fullsail/p/2833201.html
Copyright © 2020-2023  润新知