【Python】爬虫-Xpath
Xpath
文章参考:https://www.cnblogs.com/mxjhaima/p/13775844.html#%E6%A1%88%E4%BE%8B
安装
pip install lxml
引用
from lxml import etree
获取文档树对象
通过Xpath 获取文档的对象,获取到对象后,可以通过文档的对象去去获取到树中的元素。
文本转化文档树对象
def strToEleObj():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'))
文件转化文档树对象
def fileToEleObj():# 读取外部文件 index.htmlhtml = etree.parse('./index.html')# pretty_print=True 会格式化输出result = etree.tostring(html, pretty_print=True) # pretty_print=True 会格式化输出print(result)
节点、元素、属性、内容
xpath 的思想是通过 路径表达 去寻找节点。节点包括元素,属性,和内容
路径表达式
/ 根节点,节点分隔符,
// 任意位置
. 当前节点
.. 父级节点
@ 属性
示例
from lxml import etree
'''路径表达式
'''
def get_el_list():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)# 获取当前节点print('获取当前节点---> ', html.xpath('.'))# 获取 根节点 标签 ,当前元素无根节点 通过 打印 etree.tostring(html) ,会发现根节点为 <html> </html> 包裹的内容 ,上一行获取的当前节点为 htmlprint('获取 根节点 标签---> ', html.xpath('/'))# 获取 li 标签print('获取 li 标签---> ', html.xpath('//li'))# 获取 li 下的 a 标签属性print('获取li下的 a 标签属性----> ', html.xpath('//li/a/@href'))# 获取 p 标签 ,此标签不存在 返回结果为空数组print('获取 p 标签----> ', html.xpath('//p '))
输出结果
获取当前节点---> [<Element html at 0x2a989854200>]
获取 根节点 标签---> []
获取 li 标签---> [<Element li at 0x2a9898ece40>, <Element li at 0x2a9899240c0>, <Element li at 0x2a989924180>, <Element li at 0x2a9899241c0>, <Element li at 0x2a989924200>]
获取li下的 a 标签属性----> ['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']
获取 p 标签----> []
说明
- 将doc 转换成 文档对象后,为 包裹的内容;故获取到的当前的节点对象为HTML;
- 当前节点为HTML,无根节点故返回为空数组即:[];
- 查询不存在的节点时,返回空数组即:[]
通配符
* 任意元素
@* 任意属性
node() 任意子节点(元素,属性,内容)
示例
'''通配符
'''
from lxml import etree
def get_el_by_anyChar():doc = '''<div><ul class="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)# 获取 ul 下的所有子节点print('获取 ul 下的所有子节点---> ', html.xpath('//ul/node()'))# 获取 任意元素[所有的]print('获取 ul 下 任意元素[所有的]---> ', html.xpath('//ul/*'))# 获取 任意属性 [所有的]print('获取 ul 下 任意属性[所有的]---> ', html.xpath('//ul/@*'))
输出结果
获取 ul 下的所有子节点---> ['\n ', <Element li at 0x1d4792b5e80>, '\n ', <Element li at 0x1d4792b5e00>, '\n ', <Element li at 0x1d4792b5f00>, '\n ', <Element li at 0x1d4792b5f40>, '\n ', <Element li at 0x1d4792b5ec0>, ' 闭合标签\n ']
获取 任意元素---> [<Element li at 0x1d47928dd80>, <Element li at 0x1d4792b5e80>, <Element li at 0x1d4792b5fc0>, <Element li at 0x1d4792b5e00>, <Element li at 0x1d4792b5f00>]
获取 任意属性---> ['ul']
谓语
//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>元素
示例
from lxml import etree
def get_el_by_wei():doc = '''<div><ul class="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)# 获取第一个 li / a 元素 里面的文本print('获取第一个 ---> ', html.xpath('//li[1]/a/text()'))# 获取最后一个 li / a 元素 里面的文本print('获取最后一个 ---> ', html.xpath('//li[last()]/a/text()'))# 获取倒数第二个 li / a元素 里面的文本print('获取 倒数第二个---> ', html.xpath('//li[last()-1]/a/text()'))# 获取位置序号小于3,也就是前两个 li / a元素 里面的文本print('获取位置序号小于3 ---> ', html.xpath('//li[position()<3]/a/text()'))# 获取拥有href的<a>元素下的文本print('获取第一个 ---> ', html.xpath('//a[@href]/text()'))# 获取 a 标签下 href = link3.html的a元素下的文本 注意 不是 == 而是 =print('获取 a 标签下 href = link3.html的<a>元素---> ', html.xpath('//a[@href="link3.html"]/text()'))# 获取 ul class == ul 的print('获取 ul class == ul ---> ', html.xpath('//ul[@class="ul"]'))
多个路径
用| 连接两个表达式,可以进行 或匹配
//book/title | //book/price
示例
from lxml import etree
def get_el_mutil_path():doc = '''<div><ul class="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)# 获取li 下 class = item-inactive 或者 item-1print('获取li 下 class = item-inactive 或者 item-1 ---> ', html.xpath('//li[@class="item-inactive"] | //li[@class="item-1"] '))
输出结果
获取li 下 class = item-inactive 或者 item-1 ---> [<Element li at 0x1b490955f40>, <Element li at 0x1b490966200>, <Element li at 0x1b490966180>]
函数
更多函数查看https://www.w3school.com.cn/xpath/xpath_functions.asp
contains(string1,string2)
starts-with(string1,string2)
# 文本
text()
# 最后一个
last()
# 位置
position()
# 回去所有节点
node()
'''函数
'''
from lxml import etree
def get_el_func():doc = '''<div><ul class="ul" ><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.HTML(doc)# 匹配 class 包含 active 的 元素print(html.xpath("//*[contains(@class,'active')]"))# 获取所有 li / a 文本print(html.xpath("//li/a/text()"))# 获取最后一个 li / a 文本print(html.xpath("//li[last()]/text()"))# 获取位置为1的li /a 文本 ,节点时从1开始 而不是0print(html.xpath("//li[position()=1]/a/text()"))
输出结果
[<Element li at 0x23ea36d0400>, <Element li at 0x23ea36d0180>]
['first item', 'second item', 'third item', 'fourth item', 'fifth item']
[' # 注意,此处缺少一个 ']
['first item']
实战信息
获取某电影网站电影名称、简单描述、图片
import requests
from lxml import etree'''获取电影信息列表
'''
def get_moive_info_list(url):# 定义头部信息headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}res = requests.get(url, headers=headers)# res.text 返回的是 文本html = res.textprint('输出响应信息->',html)# 将文本转换成文档对象selector = etree.HTML(html)# 返回是电影名列表title_list = selector.xpath('//a[@class="pic-pack-outer"]/h3/text()')print('电影名称列表:',title_list)# 获取简单描述desc_list = selector.xpath('//a[@class="pic-pack-outer"]/p/text()')print('电影名称简单描述:', desc_list)# 图片img_list = selector.xpath('//a[@class="pic-pack-outer"]/img/@src')print('图片列表:', img_list)if __name__ == '__main__':url = 'https://xxxxxxx/vod/list/n_1_t_25/o1p1.html'get_moive_info_list(url)
输出结果
输出响应信息-> <!DOCTYPE html>
·······
</body>
</html>
电影名称列表: ['辣妈犟爸', '五月梨花香', '岁岁平安',.....]
电影名称简单描述: ['年轻村官奋斗历程', '脱贫致富振兴家乡', .....]
图片列表: ['https://image11.m1905.cn/uploadfile/2022/0804/thumb_1_150_203_20220804094442559303.jpg', .... 'https://image11.m1905.cn/uploadfile/2016/0926/thumb_1_150_85_20160926105222739343.jpg']
【Python】爬虫-Xpath相关推荐
- Python爬虫——XPath的使用
Python爬虫--XPath的使用 使用实例一:获取需要的文字 1.导入需要使用的模块 import urllib.request from lxml import etree 2.发送请求访问网站 ...
- Python 爬虫 xpath 数据解析基本用法
Python 爬虫 xpath 数据解析基本用法 1. 基本语法 1.1 解析 html 语法 1.2 获取标签 1.3 获取标签中的内容 1.4 获取标签中的属性 1.5 通过内容寻找结点 2. 实 ...
- Python - 爬虫 - Xpath定位之starts-with()和string()函数的简单使用
Python - 爬虫 - Xpath定位之starts-with()和string()函数的简单使用 文章目录 Python - 爬虫 - Xpath定位之starts-with()和string( ...
- python爬虫xpath的语法
有朋友问我正则,,okey,其实我的正则也不好,但是python下xpath是相对较简单的 简单了解一下xpath: XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML ...
- Python爬虫xpath语法及案例使用
Python爬虫之xpath语法及案例使用 ---- 钢铁侠的知识库 2022.08.15 我们在写Python爬虫时,经常需要对网页提取信息,如果用传统正则表达去写会增加很多工作量,此时需要一种对数 ...
- Python爬虫xpath详解
目录 一.xpath介绍 二.安装lxml 三.xpath解析原理 四.实例化一个etree对象 五.xpath表达式 六.爬虫实战 一.xpath介绍 xpath是一门在 XML 文档中查找信息的语 ...
- python爬虫xpath教程_使用 Xpath 进行爬虫开发
使用 Xpath 进行爬虫开发 Xpath( XML Path Language, XML路径语言),是一种在 XML 数据中查找信息的语言,现在,我们也可以使用它在 HTML 中查找需要的信息. 既 ...
- python爬虫--xpath模块简介
一.前言 前两篇博客讲解了爬虫解析网页数据的两种常用方法,re正则表达解析和beautifulsoup标签解析,所以今天的博客将围绕另外一种数据解析方法,它就是xpath模块解析,话不多说,进入内容: ...
- 表情包(图片)自生产——Python爬虫xpath实现
文章目录 严正声明:爬虫应严格遵守国家的相关法律法规,坚决做一只文明爬虫 前言 一.知识准备 二.功能解析与实现 1.引入库 2.请求准备 3.发起请求 4.数据解析 5.数据保存 6.成果展示 三. ...
- python爬虫xpath教程
环境准备: pycharm(撩妹神器,人手一个) lxml(python的三方库) 如果电脑里没有安装lxml的伙伴,可以安装一下,在控制台输入pip intall https://pypi.do ...
最新文章
- 如何使用Python和Tkinter构建Toy Markdown编辑器
- 郑宇、沈抖领衔共话 AI 业界应用挑战 | IJCAI 2019
- 苏宁11.11:苏宁易购订单搜索系统架构及实现
- Nature:中国正在上演AI人才争夺战,中国公司在与Google竞争
- dataframe 删除首尾空格_你敲空格的速度很快,但女人的手不是用来敲空格的!...
- Appium--环境搭建
- 第 20 次 CSP认证 202009-5 密信与计数
- 处理兼容问题:对于某些css3属性需要加前缀?
- Rapid7 部分源代码遭泄露,成 Codecov 供应链攻击第四个受害者
- 解决苹果mac新建txt文档在Windows下不换行的方法
- Ubuntu——虚拟显示器的配置、卸载、修改分辨率
- Android MD5加密
- Oracle PLM,协同研发的产品生命周期管理平台
- 【VUE项目实战】40、添加商品分类功能(一)
- android 距离传感器 api,Android传感器API之:近距离感应Proximity功能源码
- 数据库作业4——数据查询
- geoserver给天地图添加服务,给线加标注
- JVM#Java高墙之内存模型
- css(精灵图和字体图标)
- UML的九种图+包图
热门文章
- 金测评 手感更细腻的游戏手柄,双模加持兼容更出色,雷柏V600S上手
- 如何用stc单片机内部ad采集多路交流信号
- java ssl是什么意思_java中SSL是什么?包括哪些内容?
- 数据分析——Tableau数据可视化与仪表盘搭建
- 产品经理必看书籍推荐《水平营销》
- 用html数据库搭建信息管理系统,Node.js实现简单管理系统
- 让我们来用php编写一个抢购商品脚本
- 集8年之大成,这本书与经典畅销书有着不解之缘
- ciObjectFactory::create_new_metadata
- 海康网络摄像头忘记密码_不要忘记网络性能