【爬虫入门知识讲解: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 etreeurl = "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 etreeres = 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))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/43385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考高级第四版备考--第16天(规划沟通管理)Plan Communication Management

定义&#xff1a;基于每个干系人或干系人群体的信息需求、可用的组织资产以及具体的项目的需求&#xff0c;为项目沟通活动制定恰当的方法和计划的过程。 作用&#xff1a; 及时向干系人提供相关信息&#xff1b;引导干系人有效参与项目&#xff1b;编制书面沟通计划&#xf…

【基于R语言群体遗传学】-16-中性检验Tajima‘s D及连锁不平衡 linkage disequilibrium (LD)

Tajimas D Test 已经开发了几种中性检验&#xff0c;用于识别模型假设的潜在偏差。在这里&#xff0c;我们将说明一种有影响力的中性检验&#xff0c;即Tajimas D&#xff08;Tajima 1989&#xff09;。Tajimas D通过比较数据集中的两个&#x1d703; 4N&#x1d707;估计值来…

vue项目中常见的一些preset及其关系

Babel的作用 Babel主要用途是用来做js代码转换的&#xff0c;将最新的js语法或者api转换成低版本浏览器可兼容执行的代码。 语法兼容是指一些浏览器新特性增加的js写法&#xff0c;例如箭头函数 ()>{}&#xff1b;低版本的浏览器无法识别这些&#xff0c;会导致一些语法解…

spark shuffle写操作——UnsafeShuffleWriter

PackedRecordPointer 使用long类型packedRecordPointer存储数据。 数据结构为&#xff1a;[24 bit partition number][13 bit memory page number][27 bit offset in page] LongArray LongArray不同于java中long数组。LongArray可以使用堆内内存也可以使用堆外内存。 Memor…

秋招突击——7/9——字节面经

文章目录 引言正文八股MySQL熟悉吗&#xff1f;讲一下MySQL索引的结构&#xff1f;追问&#xff1a;MySQL为什么要使用B树&#xff1f;在使用MySQL的时候&#xff0c;如何避免索引失效&#xff1f;讲一下MySQL的事物有哪几种特征&#xff1f;MySQL的原子性可以实现什么效果&…

GESP C++ 三级真题(2023年9月)T2 进制判断

进制判断 问题描述 N进制数指的是逢N进一的计数制。例如&#xff0c;人们日常生活中大多使用十进制计数&#xff0c; 而计算机底层则一般使用二进制。除此之外&#xff0c;八进制和十六进制在一些场合也是 常用的计数制(十六进制中&#xff0c;一般使用字母A至F表示十至十五…

【区块链+跨境服务】粤澳健康码跨境互认系统 | FISCO BCOS应用案例

2020 年突如其来的新冠肺炎疫情&#xff0c;让社会治理体系面临前所未见的考验&#xff0c;如何兼顾疫情防控与复工复产成为社会 各界共同努力的目标。区块链技术作为传递信任的新一代信息基础设施&#xff0c;善于在多方协同的场景中发挥所长&#xff0c;从 而为粤澳两地的疫情…

uniapp上传文件并获取上传进度

1. 上传普通文件 uni.chooseMessageFile({count: 1,success: (res) > {console.log(res)console.log("res123456", res.tempFiles[0].path)const uploadTask uni.uploadFile({url: http://localhost:8000/demo,filePath: res.tempFiles[0].path,name: file,form…

CSS关于居中的问题

文章目录 1. 行内和块级元素自身相对父控件居中1.1. 块级元素相对父控件居中1.2. 行内元素相对于父控件居中 2. 实现单行文字垂直居中3. 子绝父相实现子元素的水平垂直居中3.1. 方案一3.1.1. 示例 3.2. 方案二3.2.1. 示例 3.3. 方案三(推荐)3.3.1. 示例 3.4. 方案四(了解一下) …

AI大模型知识点大梳理_ai大模型的精度以下哪项描述的准确

AI大模型是什么 AI大模型是指具有巨大参数量的深度学习模型&#xff0c;通常**包含数十亿甚至数万亿个参数。**这些模型可以通过学习大量的数据来提高预测能力&#xff0c;从而在自然语言处理、计算机视觉、自主驾驶等领域取得重要突破。 AI大模型的定义具体可以根据参数规模…

短信验证码研究:公开的短信验证码接口、不需要注册的短信验证码接口

短信验证码研究&#xff1a;公开的短信验证码接口、不需要注册的短信验证码接口 0 说明 本文提供了一个短信验证码接口&#xff0c;主要用于以下场景&#xff1a; 1、用于开发调试 2、用于申请验证码困难的企业和个人 3、用于短信验证码认证还没有通过&#xff0c;但是着急…

DBeaver操作MySQL无法同时执行多条语句的解决方法

DBeaver选择数据库连接&#xff0c;在【驱动属性】中将allowMultiQueries允许执行多条语句置为True

各种音频处理器

在HiFi&#xff08;高保真&#xff09;音频系统中&#xff0c;通常需要使用一些特定类型的音频处理器&#xff0c;以确保音频信号的高保真和优质输出。以下是一些常见的音频处理器类型及其在HiFi系统中的应用&#xff1a; DAC&#xff08;数模转换器&#xff09;&#xff1a; …

mysql 导出导入 数据库

导出 MySQL 数据库可以通过多种方法实现&#xff0c;最常见的方法是使用 mysqldump 工具。以下是一些常用的导出 MySQL 数据库的方法&#xff1a; 使用 mysqldump 工具 mysqldump 是一个命令行工具&#xff0c;用于导出 MySQL 数据库的结构和数据。以下是基本的导出命令&…

泰迪智能科技大数据实验室产品-实训管理平台介绍

高校大数据实验室通常配备有先进的计算机硬件和软件工具&#xff0c;以及专门的数据库和分析平台&#xff0c;以便研究人员和学生能够进行复杂的数据处理、分析和解释。主要利用大数据技术进行科学研究、技术开发和人才培养。 泰迪智能科技实训管理平台作为教学核心&#xff0c…

JS进阶-构造函数

学习目标&#xff1a; 掌握构造函数 学习内容&#xff1a; 构造函数 构造函数&#xff1a; 封装是面向对象思想中比较重要的一部分&#xff0c;js面向对象可以通过构造函数实现的封装。 同样的将变量和函数组合到了一起并能通过this实现数据的共享&#xff0c;所不同的是借助…

小程序需要进行软件测试吗?小程序测试有哪些测试内容?

在如今移动互联网快速发展的时代&#xff0c;小程序已成为人们生活中不可或缺的一部分。然而&#xff0c;面对日益增长的小程序数量和用户需求&#xff0c;小程序的稳定性和质量问题日益突显。因此&#xff0c;对小程序进行软件测试显得尤为重要。 近期的一项调查显示&#xf…

【架构】分布式与微服务架构解析

分布式与微服务架构解析 一、分布式1、什么是分布式架构2、为什么需要分布式架构3、分布式架构有哪些优势&#xff1f;4、分布式架构有什么劣势&#xff1f;5、分布式架构有哪些关键技术&#xff1f;6、基于分布式架构如何提高其高性能&#xff1f;7、如何基于架构提高系统的稳…

【工具】咸鱼小助手,一款咸鱼之王辅助工具

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ Github&#xff1a;咸鱼之王的自动化脚本&#xff0c;自动答题、爬塔、领资源等 下载&#xff1a;(密码:9u22) 咸鱼小助手 文档&#xff1a;腾讯文档 视…

软考《信息系统运行管理员》-3.2信息系统设施运维的环境管理

3.2信息系统设施运维的环境管理 1 计算机机房的选址要求 电子计算机机房地理位置 选择水源充足&#xff0c;电子比较稳定可靠&#xff0c;交通通信方便&#xff0c;自然环境清洁的地点要远离产生粉尘、油烟、有害气体以及生产或存储具有腐蚀性、易燃、易爆物品的工厂、仓库、…