zoukankan      html  css  js  c++  java
  • XPath

    1、什么是XPath

      XPath在Python的爬虫学习中,起着举足轻重的地位,对比正则表达式 re两者可以完成同样的工作,实现的功能也差不多,但XPath明显比re具有优势,在网页分析上使re退居二线。  

      XPath是什么? 全称为XML Path Language 一种小型的查询语言说道XPath是门语言。

    2、为什么要使用XPath

    • Xpath的优点

    • 可在XML中查找信息

    • 支持HTML的查找

    • 通过元素和属性进行导航

    3、怎么用XPath

    xpaht更多方法
    python开发使用XPath条件:
    由于XPath属于lxml库模块,所以首先要安装库lxml。XPath的简单调用方法

    from lxml import etree
    # 将源码转化为能被XPath匹配的格式
    selector=etree.HTML(源码) 
    
    # 返回为一列表
    selector.xpath(表达式)
    

    4、XPath语法

    1.选取节点

    nodename     选取nodename节点的所有子节点         xpath(‘//div’)         选取了所有div节点
    /            从根节点选取                        xpath(‘/div’)          从根节点上选取div节点
    //           选取所有的当前节点,不考虑他们的位置    xpath(‘//div’)         选取所有的div节点
    .            选取当前节点                        xpath(‘./div’)         选取当前节点下的div节点
    ..           选取当前节点的父节点                 xpath(‘..’)            回到上一个节点
    @            选取属性                           xpath(’//@calss’)     选取所有的class属性
    
    
    

    2.谓语

    '''
    表达式:                                    结果:
       xpath(‘/body/div[1]’)                     选取body下的第一个div节点
       xpath(‘/body/div[last()]’)                选取body下最后一个div节点
       xpath(‘/body/div[last()-1]’)              选取body下倒数第二个div节点
       xpath(‘/body/div[positon()<3]’)           选取body下前两个div节点
       xpath(‘/body/div[@class]’)                选取body下带有class属性的div节点
       xpath(‘/body/div[@class=”main”]’)         选取body下class属性为main的div节点  
       xpath(‘/body/div[price>35.00]’)           选取body下price元素值大于35的div节点
    
    '''
    
    ret=selector.xpath("//p[@class='story']//a[2]")
    ret=selector.xpath("//p[@class='story']//a[last()]")
    

    3.通配符

    '''
    通配符 Xpath通过通配符来选取未知的XML元素。
    
    表达式:                结果:
      xpath(’/div/*’)        选取div下的所有子节点
      xpath(‘/div[@*]’)      选取所有带属性的div节点
    
    '''
    
    ret=selector.xpath("//p[@class='story']/*")
    ret=selector.xpath("//p[@class='story']/a[@class]")
    

    4.取多个路劲

    '''
    使用“|”运算符可以选取多个路径
    
    表达式:                            结果:
        xpath(‘//div|//table’)         选取所有的div和table节点
    
    '''
    
    ret=selector.xpath("//p[@class='story']/a[@class]|//div[@class='d3']")
    print(ret)
    

    5.XPath轴

    '''
    轴可以定义相对于当前节点的节点集
    
    轴名称:                      表达式:                                描述:
    ancestor                      xpath(‘./ancestor::*’)                 选取当前节点的所有先辈节点(父、祖父)
    ancestor-or-self              xpath(‘./ancestor-or-self::*’)         选取当前节点的所有先辈节点以及节点本身
    attribute                     xpath(‘./attribute::*’)                选取当前节点的所有属性
    child                         xpath(‘./child::*’)                    返回当前节点的所有子节点
    descendant                    xpath(‘./descendant::*’)               返回当前节点的所有后代节点(子节点、孙节点)
    following                     xpath(‘./following::*’)                选取文档中当前节点结束标签后的所有节点
    following-sibing              xpath(‘./following-sibing::*’)         选取当前节点之后的兄弟节点
    parent                       xpath(‘./parent::*’)                   选取当前节点的父节点
    preceding                    xpath(‘./preceding::*’)                选取文档中当前节点开始标签前的所有节点
    
    preceding-sibling            xpath(‘./preceding-sibling::*’)        选取当前节点之前的兄弟节点
    self                         xpath(‘./self::*’)                     选取当前节点
    

    6.功能函数

    函数 用法 解释
    starts-with xpath(‘//div[starts-with(@id,”ma”)]‘) 选取id值以ma开头的div节点
    contains xpath(‘//div[contains(@id,”ma”)]‘) 选取id值包含ma的div节点
    and xpath(‘//div[contains(@id,”ma”) and contains(@id,”in”)]‘) 选取id值包含ma和in的div节点
    text() xpath(‘//div[contains(text(),”ma”)]‘) 选取节点文本包含ma的div节点

    7.extract() 与 extract_frist()

    extract()   指的是提取所有
    extract_frist()   指的是提取第一个
    

    8.contains


    //*[starts-with(name(),'B')] 所有名字开头为字母B的节点
    //a[contains(text(),"爬虫")] 所有包含“爬虫”字符串的a标签
    tree.xpath('string(//dt[text()="面积"]/following-sibling::dd/text())')  包含 面积 的 dt 标签的兄弟标签
    

  • 相关阅读:
    Cgroup学习笔记
    基于dubbo框架下的RPC通讯协议性能测试
    More about dubbo
    基于nginx tomcat redis分布式web应用的session共享配置
    基于开源Dubbo分布式RPC服务框架的部署整合
    More about Tair (NoSql)
    MySql Replication配置
    Memcached、Redis OR Tair
    基于淘宝开源Tair分布式KV存储引擎的整合部署
    关于TbSchedule任务调度管理框架的整合部署
  • 原文地址:https://www.cnblogs.com/kai-/p/11845783.html
Copyright © 2011-2022 走看看