zoukankan      html  css  js  c++  java
  • [Python自学] 爬虫(4)xpath

    一、xpath

    1.安装xpath

    pip install lxml

    2.简单使用

    获取根目录下的html标签对象:

    import requests
    
    from lxml import etree
    
    res = requests.get("https://www.bilibili.com/")
    
    html = etree.HTML(res.content.decode('utf-8'))
    html_data = html.xpath('/html')  # 获取根目录下的html标签
    print(html_data)  # [<Element html at 0x25018d16408>] 是一个列表,包含一个html标签对象

    二、xpath语法

    1.选择节点

    表达式描述
    nodename 选取此节点的所有子节点。
    / 从根节点选取。
    // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
    . 选取当前节点。
    .. 选取当前节点的父节点。
    @ 选取属性。

    例子:

    html_data = html.xpath('/html')  # 选择根目录下的html标签
    html_data = html.xpath('/html/body')  # 选择html标签下的body标签
    html_data = html.xpath('//div')  # 选择所有div标签(不关心位置)
    html_data = html.xpath('/html//div')  # 选择html标签下的所有div标签(不关心位置)
    html_data = html.xpath('//@src')  # 选择所有src属性的值

    注意,返回的结果都是列表,要注意判断列表中元素的个数是否为0。

    2.Predicates(谓语)

    路径表达式结果
    /bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
    /bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
    /bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
    /bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
    //title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
    //title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
    /bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
    /bookstore/book[price>35.00]//title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

    例子:

    html_data = html.xpath('/html/body/div[1]')  # 获取body标签下子标签中第一个div标签(注意index从1开始)
    html_data = html.xpath('/html/body/div[last()]')  # 获取body标签下子标签中最后一个div标签
    html_data = html.xpath('/html/body/div[last()-1]')  # 获取body标签下子标签中倒数第二个div标签
    html_data = html.xpath('/html/body/div[position()<3]')  # 获取body标签下子标签中idx小于3的两个div标签
    html_data = html.xpath('/html/body/div[@class]')  # 获取body标签下子标签中所有拥有class属性的div标签
    html_data = html.xpath('/html/body/div[@id="app"]')  # 获取body标签下子标签中所有id="app"的div标签

    3.通配选择

    通配符描述
    * 匹配任何元素节点。
    @* 匹配任何属性节点。
    node() 匹配任何类型的节点。
    路径表达式结果
    /bookstore/* 选取 bookstore 元素的所有子元素。
    //* 选取文档中的所有元素。
    //title[@*] 选取所有带有属性的 title 元素。

    4.多条件选择

    路径表达式结果
    //book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
    //title | //price 选取文档中的所有 title 和 price 元素。
    /bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

    5.XPath 轴(Axes)

    轴可定义相对于当前节点的节点集。

    轴名称结果
    ancestor 选取当前节点的所有先辈(父、祖父等)。
    ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
    attribute 选取当前节点的所有属性。
    child 选取当前节点的所有子元素。
    descendant 选取当前节点的所有后代元素(子、孙等)。
    descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
    following 选取文档中当前节点的结束标签之后的所有节点。
    following-sibling 选取当前节点之后的所有兄弟节点
    namespace 选取当前节点的所有命名空间节点。
    parent 选取当前节点的父节点。
    preceding 选取文档中当前节点的开始标签之前的所有节点。
    preceding-sibling 选取当前节点之前的所有同级节点。
    self 选取当前节点。

    xpath中的轴是跟在"/"后的一个表述字符,默认的"/"相当于"/child":

    /html/body/div
    # 相当于
    /html/body/child::div

    我们默认使用"/"获取的都是子节点。也可以使用其他的轴来获取不同关系的节点。例如:

    html_data = html.xpath('/html/body/div/ancestor::*')  # 获取/html/body/div节点的所有先辈节点,[<Element html at 0x2156955fec8>, <Element body at 0x2156955ff88>]
    html_data = html.xpath('/html/body/div/ancestor-or-self::*')  # 获取/html/body/div节点的所有先辈节点以及自己(这里有3个div) 
    # [<Element html at 0x1b74790df48>, <Element body at 0x1b7479181c8>, <Element div at 0x1b746a9c348>, <Element div at 0x1b747918108>, <Element div at 0x1b7479180c8>]

    其他轴的使用方法以此类推。

    6.xpath使用属性匹配

    html_data = html.xpath('//div[starts-with(@class,"international")]')  # class属性以international开头
    html_data = html.xpath('//div[ends-with(@class,"app")]')  # class属性以app结尾
    html_data = html.xpath('//div[contains(@class,"app")]')  # class属性包含app字符串

    在使用这些字符串处理函数时,要注意支持的xpath版本,有可能这些函数会报错,例如python在使用lxml时,ends-with不工作。

    ====

  • 相关阅读:
    Centos 7 zabbix 实战应用
    Centos7 Zabbix添加主机、图形、触发器
    Centos7 Zabbix监控部署
    Centos7 Ntp 时间服务器
    Linux 150命令之查看文件及内容处理命令 cat tac less head tail cut
    Kickstart 安装centos7
    Centos7与Centos6的区别
    Linux 150命令之 文件和目录操作命令 chattr lsattr find
    Linux 发展史与vm安装linux centos 6.9
    Linux介绍
  • 原文地址:https://www.cnblogs.com/leokale-zz/p/12894378.html
Copyright © 2011-2022 走看看