• 爬虫之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(.)函数提取。

        • 相关阅读:
          猿创征文|微信小程序扫描二维码如何跳转小程序内指定页面并传递参数给目标页面?
          机器学习-决策树算法
          [Qt桌面开发]一个Qt简单界面的开发
          AttributeError: ‘HTMLParser‘ object has no attribute ‘unescape‘解决方案
          周末和技术大咖们聚餐,聊到了软件测试行业的“金九银十”高峰【内卷之势已然形成】
          强化学习环境 - robogym - 学习 - 1
          8. sqoop-1.4.7安装部署
          最长公共子序列
          搭建第一个区块链网络
          java Stream编程笔记
        • 原文地址:https://blog.csdn.net/seanyang_/article/details/126911300