zoukankan      html  css  js  c++  java
  • xpath解析数据

    xpath解析数据

    """
    xpath 也是一种用于解析xml文档数据的方式
    xml path
    w3c xpath搜索用法
    
    在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。都要用/
    """
    
    doc = """
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <html>
        <body>
            <bookstore id="test" class="ttt">
            
            <book id= "1" class = "2">
              <title lang="eng">Harry Potter</title>
              <price>29.99</price>
            </book>
            
            <book id = "2222222222222">11111111111111111111
              <title lang="abc">Learning XML</title>
              <price>39.95</price>
            </book>
            
            </bookstore>
        <a></a>
        </body>
    </html>
    """
    
    from lxml import etree
    html = etree.HTML(doc)
    print(html.xpath("/bookstore")) # 从根标签找所有匹配的 列表形式
    print(html.xpath("//bookstore")) # 全文中找所有匹配的 列表形式
    
    
    # 通配符 *
    print(html.xpath("//book")) #全文中找所有book标签
    print(html.xpath("//*"))  # 全文中找所有标签
    
    
    # 获取属性
    print(html.xpath("//bookstore/@id")) #获取id属性
    print(html.xpath("//bookstore/@*")) #获取所有属性
    
    
    # 嵌套
    print(html.xpath("//bookstore/book/title/text()"))
    
    
    ==============================================================================
    # 加上谓语(条件) 
    
    # 指定要获取的索引
    # print(html.xpath("//bookstore/book[1]/title/text()")) # 获取第一个
    # print(html.xpath("//bookstore/book[last()-1]/title/text()")) # last() 最后一个     last()-1 倒数第二个
    # print(html.xpath("//bookstore/book[position()>1]/title/text()")) # 索引大于1的
    
    
    # xpath 原生 既能查找属性 又能查找标签   而在selenium只能查找标签
    # 查找price的值大于30的book标签
    # e = html.xpath("//book[price > 30]")[0]
    # print(e.text) # 访问文本 不包含子标签的文本 只包含自己标签的文本
    # print(e.attrib) # 访问属性
    
    
    # 用属性来作限制
    # 只要存在lang属性即可
    print(html.xpath("//*[@lang]"))
    
    # 找的是具备lang并且值为abc的标签
    print(html.xpath("//*[@lang='abc']"))
    #获取其属性
    print(html.xpath("//*[@lang='abc']")[0].attrib)
    
    # 只要 有属性即可
    print(html.xpath("//*[@*]"))
    
    # 多个匹配条件
    print(html.xpath("//title|//price"))
    
    
    ==================================================================================
    # 轴匹配  (先拿到一个标签 在相对这个标签找其他标签)   
    
    print(html.xpath("//bookstore/ancestor::*")) # 所有先辈
    print(html.xpath("//bookstore/ancestor::body")) # 所有叫body的先辈
    print(html.xpath("//bookstore/ancestor-or-self::*")) # 所有先辈包含他自己
    
    
    # 获取属性
    print(html.xpath("//bookstore/attribute::id"))
    print(html.xpath("//bookstore/@id"))
    
    # 所有子级标签(只有子级)
    print(html.xpath("//bookstore/child::*"))
    
    # 所有后代标签
    print(html.xpath("//bookstore/descendant::*"))
    
    # 在这个标签后面的所有标签  与层级无关
    print(html.xpath("//book[1]/following::*")) #第一个book后的所有标签
    
    # 获取弟弟们(他后面的同级标签)
    print(html.xpath("//book[1]/following-sibling::*"))
    
    # 获取哥哥们(它前面的同级标签)
    print(html.xpath("//book[1]/preceding-sibling::*"))
    
    
    # 获取父级
    print(html.xpath("//book[1]/parent::*"))
    
    
    # 获取既有id属性 又有class属性的标签
    print(html.xpath("//*[@id and @class]"))
  • 相关阅读:
    UVa 10810
    Android UI开发第三十四篇——SlidingPaneLayout
    eclipse安装插件checkstyle
    eas bos 编辑界面 editUIt 属性值为空
    [置顶] 使用U盘安装ubuntu系统
    Ajax核心——XMLHttpRequest基础
    转储指定的数据块并查看TRC信息
    android 获取当前版本号/修改自定义的应用程序的版本号
    poj3101
    [置顶] mysql中的set和enum类型的用法和区别
  • 原文地址:https://www.cnblogs.com/lizeqian1994/p/10751180.html
Copyright © 2011-2022 走看看