关于Python爬虫Xpath的一切都在这里了

2023-11-01

Xpath是python爬虫过程中,非常重要的一种用来定位的语法。

PART

01

开始使用

首先我们需要得到一个 HTML 源代码,用来模拟爬取网页中的源代码。

先下载lxml 包。

pip install lxml

准备HTML源代码。

from lxml import etree

doc='''
        <div>
            <ul>
                 <li class="item-0"><a href="link1.html">first item</a></li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a> # 注意,此处缺少一个 </li> 闭合标签
             </ul>
         </div>
        '''

html = etree.HTML(doc)
result = etree.tostring(html)
print(str(result, 'utf-8'))

PART

02

节点、元素、属性、内容

xpath的思想是通过路径表达去寻找节点。节点包括元素,属性,和内容。

2.1 路径表达式

/   根节点,节点分隔符,
//  任意位置
.   当前节点
..  父级节点
@   属性

2.2 通配符

*   任意元素
@*  任意属性
node()  任意子节点(元素,属性,内容)

2.3 谓语

使用中括号来限定元素,称为谓语

//a[n] n为大于零的整数,代表子元素排在第n个位置的<a>元素
//a[last()] last()代表子元素排在最后个位置的<a>元素
//a[last()-] 和上面同理,代表倒数第二个
//a[position()<3] 位置序号小于3,也就是前两个,这里我们可以看出xpath中的序列是从1开始
//a[@href] 拥有href的<a>元素
//a[@href='www.baidu.com'] href属性值为'www.baidu.com'<a>元素
//book[@price>2] price值大于2<book>元素

PART

03

定位

3.1 匹配多个元素,返回列表

from lxml import etree

if __name__ == '__main__':
    doc='''
        <div>
            <ul>
                 <li class="item-0"><a href="link1.html">first item</a></li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a>
             </ul>
         </div>
        '''

    html = etree.HTML(doc)
    print(html.xpath("//li"))
    print(html.xpath("//p"))
    print(etree.tostring(html.xpath("//li[@class='item-inactive']")[0]))
    print(html.xpath("//li[@class='item-inactive']")[0].text)
    print(html.xpath("//li[@class='item-inactive']/a")[0].text)
    print(html.xpath("//li[@class='item-inactive']/a/text()"))
    print(html.xpath("//li[@class='item-inactive']/.."))
    print(html.xpath("//li[@class='item-inactive']/../li[@class='item-0']"))

3.2 contains

有的时候,class作为选择条件的时候不合适@class=‘…’ 这个是完全匹配,当网页样式发生变化时,class或许会增加或减少像active的class。用contains就能很方便。


from lxml import etree
if __name__ == '__main__':
    doc='''
        <div>
            <ul>
                 <p class="item-0 active"><a href="link1.html">first item</a></p>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a> # 注意,此处缺少一个 </li> 闭合标签
             </ul>
         </div>
        '''

    html = etree.HTML(doc)
    print(html.xpath("//li[@class='item']"))
    print(html.xpath("//*[contains(@class,'item')]"))

3.3 starts-with

包含某个属性的第一个节点。


from lxml import etree
if __name__ == '__main__':
    doc='''
        <div>
            <ul class='ul items'>
                 <p class="item-0 active"><a href="link1.html">first item</a></p>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a> # 注意,此处缺少一个 </li> 闭合标签
             </ul>
         </div>
        '''

    html = etree.HTML(doc)
    print(html.xpath("//*[contains(@class,'item')]"))
    print(html.xpath("//*[starts-with(@class,'ul')]"))

3.4 text、last


from lxml import etree

if __name__ == '__main__':
    doc='''
        <div>
            <ul class='ul items'>
                 <p class="item-0 active"><a href="link1.html">first item</a></p>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a> # 注意,此处缺少一个 </li> 闭合标签
             </ul>
         </div>
        '''

    html = etree.HTML(doc)
    print(html.xpath("//li[last()]/a/text()"))

3.5 获取内容

上面已经提到过,可以使用.texttext()的方式来获取元素的内容。


from lxml import etree
if __name__ == '__main__':
    doc='''
        <div>
            <ul class='ul items'>
                 <li class="item-0 active"><a href="link1.html">first item</a></li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a> # 注意,此处缺少一个 </li> 闭合标签
             </ul>
         </div>
        '''
    html = etree.XML(doc)
    print(html.xpath("//a/text()"))
    print(html.xpath("//a")[0].text)
    print(html.xpath("//ul")[0].text)
    print(len(html.xpath("//ul")[0].text))
    print(html.xpath("//ul/text()"))

3.6 获取属性

print(html.xpath("//a/@href"))
print(html.xpath("//li/@class"))

PART

04

使用Xpath爬取豆瓣

import requests
from lxml import etree


def main():
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
    }

    baseurl = "https://movie.douban.com/top250?start="

    res = requests.get(url=baseurl, headers=head).text

    data = etree.HTML(res)

    # 电影排行榜
    txt = data.xpath('//*[@id="content"]/div/div[1]/ol/li')

    list = []

    for i in txt:
        vidow = {
            "title": "",
            "year": '',
            "score": 0,
            "num": 0
        }
        title_list = i.xpath('./div/div[2]/div[1]/a/span/text()')
        for item in title_list:
            vidow['title'] += item.replace("\n", "").replace("\xa0", " ")

        vidow['year'] = i.xpath('./div/div[2]/div[2]/p[1]/text()')[1].split("/")[0].replace("\n", "").replace("\xa0", " ").replace(" ", "")
        vidow['score'] = i.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]
        vidow['num'] = i.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0].replace("人评价", "")

        list.append(vidow)

    print(list)


if __name__ == '__main__':
    main()

如果你也喜欢编程,想通过学习Python获取更高薪资,这里给大家分享一份Python学习资料。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Python爬虫Xpath的一切都在这里了 的相关文章

随机推荐

  • 小米手机 解BL锁

    Beauty provoketh thieves sooner than gold As You Like It 解锁下载官网 解锁方法
  • 报错:ORA-00955:名称已由现有对象使用

    报错 ORA 00955 名称已由现有对象使用 查下名称看看 是不是已经有视图或者表存在 我遇到的是确实存在了 可能已经创建成功了 或者用个不一样的名称
  • MacBook M1 配置 tensorflow开发环境

    MacBook M1 配置 tensorflow开发环境 方法一 提示 目前MacBook M1在安装和配置深度学习的框架tensorflow上由于兼容性的问题存在着很多困扰 本文将给出详细的安装说明 文章目录 MacBook M1 配置
  • XiaoMi NoteBook Pro EFI 黑苹果引导文件

    TM1701 和 TM1707 规格 详细信息 电脑型号 小米笔记本电脑Pro 15 6 MX150 GTX 处理器 英特尔 酷睿 i5 8250U i7 8550U 处理器 内存 8GB 16GB 三星 DDR4 2400MHz 硬盘 三
  • ubuntu安装dlib

    电脑内部环境很多 传统pip无法安装 3 0环境有dlib 最近用2 7的环境 发现没有 好久没装了 试了一些方法并不work 还是用的老指令 conda install c menpo dlib 18 18
  • Word调用ChatGPT

    目录 前言 一 ChatGPT是什么 二 使用步骤 1 申请ChatGPT的API KEY 2 创建宏模块 3 添加工具栏按钮 4 使用此模块的方法 总结 前言 此文章目的是将ChatGPT作为工具在Word中直接使用 以快速生成自己想要的
  • 《计算机网络》(第8版)第三章 数据链路层 知识点总结

    文章目录 1 数据链路层的三个基本问题 1 1 封装成帧 framing 1 2 透明传输 1 3 差错检测 1 3 1 循环冗余检验CRC Cycle Redundancy Check 1 3 2 FCS计算图 2 点到点协议PPP及其透
  • 毕业设计 - 树莓派寝室宿舍门禁刷卡系统 - 物联网 单片机 嵌入式

    文章目录 0 前言 1 前言 2 主要器件 3 实物效果 4 树莓派读取 RC522 RFID 标签 5 mg90s 控制原理 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕
  • 公司网络故障总结

    公司网络故障总结 Author skate Time 2007 6 8 今天早上一到公司 刚坐下 买的早饭还没吃呢 就有人打电话反映不能上网 我以为是个别机器的问题 但我还是检测一下 查看网络是否畅通 查看结果是不通 于是就要分析原因 要尽
  • Redis基础与高可用集群架构进阶详解

    一 NoSQL简介 1 问题引入 每年到了过年期间 大家都会自觉自发的组织一场活动 叫做春运 以前我们买票都是到火车站排队 后来呢 有了 12306 有了它以后就更方便了 我们可以在网上买票 但是带来的问题 大家也很清楚 春节期间买票进不去
  • 西瓜书作业4.4(基于基尼指数划分决策树,未剪枝/预剪枝/后剪枝)

    文章目录 题目 未减枝 思想 画图 预剪枝 思想 画图 后剪枝 思想 画图 比较总结 参考 全部代码 画图代码 题目 试编程实现基于基尼指数进行划分选择的决策树算法 为表4 2中数据生成预剪枝 后剪枝决策树 并与未剪枝决策树进行比较 牢骚
  • 密码学与网络安全 - 11 密码学Hash函数

    11 密码学Hash函数 Hash函数输入长度可变 而输出长度固定 合格的Hash函数输出应该均匀分布 看起来随机 Hash函数两个要求 1 抗碰撞性 找到两个不同的输入对应相同的输出在计算上不可行 2 单向性 通过Hash值找到输入值在计
  • Vue突然报错 doesn‘t work properly without JavaScript enabled

    突然报错未启用JavaScript 下午演示项目的时候突然给我整了一出JavaScript未启用 当场就把我整尴尬了 然后我怀疑是不是写的路由守卫有问题就注释了再试 发现问题还在 然后经过各种骚操作以后 发现还是报这个js未启用 当场我就不
  • Idea 激活插件IDEA Eval Reset食用

    在setting中的Plugins中点击设置小图标 点击第一个选项 添加远程仓库 2 点击 号 输入 https plugins zhile io 3 搜索 IDEA Eval Reset 安装 4 Help gt Eval Restart
  • 短短半小时 创建自己的个性操作系统

    短短半小时 创建自己的个性操作系统 邹震 大家认为桌面使用比较困难 但是前段时间推出一款Whitefin 而且可以在半小时内自己创建个性操作系统 今天我们采访一下 熊伟 先生 熊伟 先生您好 我们想请您谈一下Whitefin这个的来源 熊伟
  • 分数构造方法java,Java--构造方法

    1 构造方法 类中的特殊方法 主要用于创建并初始化对象 2 特点 构造方法的名称与类名完全相同 没有返回值类型 定义的时候不用写 void 普通方法没有返回值的时候 要写void 创建对象时 触发构造方法的调用 不可以通过句点手动调用 方法
  • Typescript学习——接口

    接口 interface TypeScript 的核心原则之一就是对 值 所具有的结构进行类型检查 而接口的作用就是为这些类型命名或为你的第三方代码定义契约 相当于定义了值的类型 用法 const foo params name strin
  • C语言: 数组指针/指针数组等相关的选择题目

    文章目录 写在前面 形参和实参 二维数组传参 字符数组 二维数组 函数指针数组 参数匹配 多级指针 写在前面 本篇总结的是和指针相关的有难度的选择题 并对这些题进行解析和分析 形参和实参 下面程序的运行结果是什么 include
  • C/S和B/S的区别和优缺点

    一 CS BS架构定义 1 C S Client Server 客户端 服务器结构 C S结构在技术上很成熟 它的主要特点是交互性强 具有安全的存取模式 网络通信量低 响应速度快 利于处理大量数据 因为客户端要负责绝大多数的业务逻辑和UI展
  • 关于Python爬虫Xpath的一切都在这里了

    Xpath是python爬虫过程中 非常重要的一种用来定位的语法 PART 01 开始使用 首先我们需要得到一个 HTML 源代码 用来模拟爬取网页中的源代码 先下载lxml 包 pip install lxml 准备HTML源代码 fro