zoukankan      html  css  js  c++  java
  • 1.7XPath

    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() 指的是提取第一个

  • 相关阅读:
    ecshop里的$_CFG从哪来的
    高效PHP程序必知的53个技巧
    Jquery结合datagrid框架
    PHP数据类型转换(字符转数字,数字转字符)
    php 操作数组 (合并,拆分,追加,查找,删除等)
    css3制作导航栏
    php日期转时间戳,指定日期转换成时间戳
    PHP 时间与字符串的相互转化
    php 生成.txt文件
    linux PHP yum 安装phpzie
  • 原文地址:https://www.cnblogs.com/hsinfo/p/13775795.html
Copyright © 2011-2022 走看看