• 【爬虫入门知识讲解:xpath】


    3.3、xpath

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

    xpath 全称为XML Path Language 一种小型的查询语言
    xpath的优点:

    • 可在XML中查找信息
    • 支持HTML的查找
    • 通过元素和属性进行导航

    python开发使用XPath条件: 由于XPath属于lxml库模块,所以首先要安装库lxml。

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

    【1】路径表达式

    表达式描述实例解析
    /从根节点选取/body/div[1]选取根结点下的body下的第一个div标签
    //从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置//a选取文档中所有的a标签
    ./当前节点再次进行xpath./a选取当前节点下的所有a标签
    @选取属性//@calss选取所有的class属性

    【2】谓语(Predicates)

    谓语用来查找某个特定的节点或者包含某个指定的值的节点。

    谓语被嵌在方括号中。

    在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

    路径表达式结果
    /ul/li[1]选取属于 ul子元素的第一个 li元素。
    /ul/li[last()]选取属于 ul子元素的最后一个 li元素。
    /ul/li[last()-1]选取属于 ul子元素的倒数第二个 li元素。
    //ul/li[position()❤️]选取最前面的两个属于 ul元素的子元素的 li元素。
    //a[@title]选取所有拥有名为 title的属性的 a元素。
    //a[@title=‘xx’]选取所有 a元素,且这些元素拥有值为 xx的 title属性。
    //a[@title>10] > < >= <= !=选取 a元素的所有 title元素,且其中的 title元素的值须大于 10。
    /body/div[@price>35.00]选取body下price元素值大于35的div节点

    【3】选取未知节点

    XPath 通配符可用来选取未知的 XML 元素。

    通配符描述
    *匹配任何元素节点。
    @*匹配任何属性节点。
    node()匹配任何类型的节点。

    实例

    在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

    路径表达式结果
    /ul/*选取 bookstore 元素的所有子元素。
    //*选取文档中的所有元素。
    //title[@*]选取所有带有属性的 title 元素。
    //node()获取所有节点

    【4】选取若干路径

    通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

    实例

    在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

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

      //div[@id="head" and @class="s_down"] # 查找所有id属性等于head并且class属性等于s_down的div标签
      //title | //price # 选取文档中的所有 title 和 price 元素,“|”两边必须是完整的xpath路径
      
    • 属性查询

      //div[@id] # 找所有包含id属性的div节点
      //div[@id="maincontent"]  # 查找所有id属性等于maincontent的div标签
      //@class
      //li[@name="xx"]//text()  # 获取li标签name为xx的里面的文本内容
      
    • 获取第几个标签 索引从1开始

      tree.xpath('//li[1]/a/text()')  # 获取第一个
      tree.xpath('//li[last()]/a/text()')  # 获取最后一个
      tree.xpath('//li[last()-1]/a/text()')  # 获取倒数第二个
      
    • 模糊查询

      //div[contains(@id, "he")]  # 查询所有id属性中包含he的div标签
      //div[starts-with(@id, "he")] # 查询所有id属性中包以he开头的div标签
      //div/h1/text()  # 查找所有div标签下的直接子节点h1的内容
      //div/a/@href   # 获取a里面的href属性值 
      //*  #获取所有
      //*[@class="xx"]  #获取所有class为xx的标签
      
      # 获取节点内容转换成字符串
      c = tree.xpath('//li/a')[0]
      result=etree.tostring(c, encoding='utf-8')
      print(result.decode('UTF-8'))
      

    【5】案例

    豆瓣Top250基于xpath解析:

    import requests
    from lxml import etree
    
    url = "https://movie.douban.com/top250?start=0"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36"
    }
    resp = requests.get(url, headers=headers)
    
    tree = etree.HTML(resp.text)  # 加载页面源代码
    
    items = tree.xpath('//li/div[@class="item"]/div[@class="info"]')
    
    for item in items:
        title = item.xpath('./div[@class="hd"]/a/span[1]/text()')[0]
        rating_num = item.xpath('./div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0]
        comment_num = item.xpath('./div[@class="bd"]/div[@class="star"]/span[4]/text()')[0]
        print(title, rating_num, comment_num)
    
    

    练习:基于xpath完成解析练习

    import requests
    from lxml import etree
    
    res = requests.get("https://top.baidu.com/board?platform=pc&sa=pcindex_entry", )
    
    selector = etree.HTML(res.text)
    
    rets = selector.xpath('//div[@theme="car"]//div[contains(@class,"item-wrap_Z0BrP ")]')
    
    info = {}
    for i in rets:
        name = i.xpath('./div[@class="normal_1glFU"]/a/text()')
        link = i.xpath('./div[@class="normal_1glFU"]/a/@href')
        info[name[0]] = link[0]
    
    print(info)
    print(len(info))
    
    
  • 相关阅读:
    C语言每日一题(26)移除链表元素
    GaussDB之应用无损透明(ALT)
    物联网开发笔记(10)- 使用Wokwi仿真micropython on ESP32开发板实现舵机控制
    音频的各项指标
    凉鞋的 Godot 笔记 001. 概述
    HTML—css
    四、T100固定资产之固定资产折旧计提
    [PAT练级笔记] 13 Basic Level 1015
    Java InputStram/OutputStream
    Qt QImag图像保存、格式转换
  • 原文地址:https://blog.csdn.net/weixin_50556117/article/details/140312150