xpath 和 pyquery

作者: 谢小路 | 来源:发表于2017-01-14 17:49 被阅读850次

    主题:

    **xpath 和 pyquery **

    xpath

    • 选取节点
    表达式 描述 实例 介绍
    nodename 选取nodename节点的所有子节点 xpath("//div")
    / 从根节点选取 xpath('/div')
    // 选取所有的当前节点,不考虑位置 xpath("//div")
    . 选取当前节点 xpath(‘./div’) 选取当前节点下的div节点
    .. 选取当前节点的父节点 xpath(‘..’) 回到上一个节点
    @ 选取属性 xpath(’//@calss’) 选取所有的class属性
    • 谓语
    表达式 结果
    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节点
    • 通配符
    表达式 结果
    xpath(’/div/*’) 选取div下的所有子节点
    xpath(‘/div[@*]’) 选取所有带属性的div节点
    • 取多个路径
    表达式 结果
    xpath(‘//div|//table’) 选取所有的div和table节点
    • 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::*’) 选取当前节点
    • 功能函数
    1.png

    使用xpath中,多结合功能函数和谓语的使用可以减少提取信息的难度

    • 总结
    1. 节点的遍历
    2. 属性的提取
    3. 文本的提取

    pyquery

    可以让你用jquery语法来对xml进行查询

    • 基本概念
    2.png 1484385342126.png
    • 提取:Fiserv Inc
    doc = PyQuery(html)
    使用id标签
    doc("#instrumentname").text()
    
    'Fiserv Inc.'
    
    • 提取:NASDAQ: FISV
    使用id标签
    doc("#instrumentticker").text()
    'NASDAQ: FISV'
    
    使用class 标签
    doc(".textdeemphasized").text()
    'NASDAQ: FISV'
    
    使用tagname 
    doc("p").eq(0).text() # p元素包含很多个,eq(0)表示是第一个p元素
    'NASDAQ: FISV'
    
    • 提取p元素
    all_tag_p = doc("p").items()
    
    for one in all_tag_p:
        print (one.text())
    
    NASDAQ: FISV
    Set Alerts
    Find a Broker
    Join TD Ameritrade
    Market Index
    After Hours
    -- Quotes are delayed by 20 min
    Jan 13, 2017, 4:44 p.m.
    $
    110.30
    
    Change
    0.00 0.00%
    Volume
    Volume 31,006
    Quotes are delayed by 20 min
    Previous close
    ...
    
    
    
    • 提取属性值attr
    p_id = doc("p").attr("id")
    
    'instrumentticker'
    
    p_class = doc("p").attr("class")
    
    'textdeemphasized'
    
    • 总结
    1. 获取标签值:tag
    2. 获取属性:#, .
    3. 获取文本:text()

    做的绝大多数爬行就是对标签、属性、文本等的获取,关键是选择较好的适合自己的方法,当然各种方法的选择效率也不一样。我比较属性的是xpath, 然而当我接触到pyquery看下文档就差不多也能获取到自己需要的网页内容,接下来关键是熟悉的过程。

    参考

    相关文章

      网友评论

        本文标题:xpath 和 pyquery

        本文链接:https://www.haomeiwen.com/subject/rknebttx.html