• 爬虫之xpath


    lxml模块

    lxml 库是一款 Python 数据解析库,参考重要文档在 lxml - Processing XML and HTML with Python,项目开源地址在:GitHub - lxml/lxml: The lxml XML toolkit for Python

    在Python中,为了使用XPath,需要安装一个第三方库:lxml,使用lxml才能从html通过xpath方法读取内容

    1. import lxml.html
    2. selector=lxml.html.fromstring(html2)
    3. content=selector.xpath('//div[contains(@id,"-key")]/text()')

    Xpath语法

    xpath的核心思想是写地址

    获取文本:

     获取属性值

     //开始为绝对路径,从需要提取的内容往上找标签,找到一个拥有“标志性属性值”的标签为止。

    1. <div class="userful">
    2. <ul>
    3. <li class="info">我需要的信息1li>
    4. <li class="test">我需要的信息2li>
    5. <li class="strange">我需要的信息3li>
    6. ul>
    7. div>

    如这段内容,//div[@class='useful']/ul/li/text()就能得到三个文本信息。

    以相同字符串开头

    如果只需要提取某些属性开头的内容,可用如下方法

    //标签[starts-with(@属性名,"相同的开头部分")]

    1. html2="""
    2. 测试
    3. 需要的内容1
    4. 需要的内容2
    5. 不需要的内容1
    6. """
    7. import lxml.html
    8. selector=lxml.html.fromstring(html2)
    9. content=selector.xpath('//div[starts-with(@id,"test")]/text()')
    10. for each in content:
    11. print(each)

     

     属性值包含相同字符串

    如果提取内容属性值包含相同字符串,可以用contains方法

    1. html2="""
    2. 测试
    3. 需要的内容1
    4. 需要的内容2
    5. 不需要的内容1
    6. """
    7. import lxml.html
    8. selector=lxml.html.fromstring(html2)
    9. content=selector.xpath('//div[contains(@id,"-key")]/text()')
    10. for each in content:
    11. print(each)

     对XPath返回的对象执行XPath

    XPath也支持先抓大再抓小

    1. html2="""
    2. 测试
      • 我需要的信息1
    3. 我需要的信息2
  • 我需要的信息3
    • 垃圾1
    • 垃圾2
    • """
    • import lxml.html
    • selector=lxml.html.fromstring(html2)
    • content=selector.xpath('//div[@class="userful"]/ul/li/text()')
    • for each in content:
    • print(each)
    • 也可以:

      1. html2="""
      2. 测试
        • 我需要的信息1
        • 我需要的信息2
        • 我需要的信息3
          • 垃圾1
          • 垃圾2
          • """
          • import lxml.html
          • selector=lxml.html.fromstring(html2)
          • useful=selector.xpath('//div[@class="userful"]')#这里返回一个列表
          • infolist=useful[0].xpath('ul/li/text()')
          • print(infolist)

           

           同时提取子标签文字

          先获取节点,再对节点使用xpath,用string(.)函数提取。

        • 相关阅读:
          浅谈HTTP 和 HTTPS (中间人问题)
          协程理解1
          LocalDateTime 接受前端参数
          Mysql——存储引擎
          vscode 设置打开终端的默认工作目录/路径
          你还在找淘宝商品信息查询的接口吗?
          微软官方操作系统(需空U盘)
          [附源码]计算机毕业设计基于springboot的家政服务平台
          「Redis」01 NoSQL及Redis概述
          3. 队列基本概念、【队列顺序+链式存储】实现、双端队列
        • 原文地址:https://blog.csdn.net/seanyang_/article/details/126911300