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 标签---->  []

说明

  1. 将doc 转换成 文档对象后,为 包裹的内容;故获取到的当前的节点对象为HTML;
  2. 当前节点为HTML,无根节点故返回为空数组即:[];
  3. 查询不存在的节点时,返回空数组即:[]

通配符

*   任意元素
@*  任意属性
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相关推荐

  1. Python爬虫——XPath的使用

    Python爬虫--XPath的使用 使用实例一:获取需要的文字 1.导入需要使用的模块 import urllib.request from lxml import etree 2.发送请求访问网站 ...

  2. Python 爬虫 xpath 数据解析基本用法

    Python 爬虫 xpath 数据解析基本用法 1. 基本语法 1.1 解析 html 语法 1.2 获取标签 1.3 获取标签中的内容 1.4 获取标签中的属性 1.5 通过内容寻找结点 2. 实 ...

  3. Python - 爬虫 - Xpath定位之starts-with()和string()函数的简单使用

    Python - 爬虫 - Xpath定位之starts-with()和string()函数的简单使用 文章目录 Python - 爬虫 - Xpath定位之starts-with()和string( ...

  4. python爬虫xpath的语法

    有朋友问我正则,,okey,其实我的正则也不好,但是python下xpath是相对较简单的 简单了解一下xpath: XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML ...

  5. Python爬虫xpath语法及案例使用

    Python爬虫之xpath语法及案例使用 ---- 钢铁侠的知识库 2022.08.15 我们在写Python爬虫时,经常需要对网页提取信息,如果用传统正则表达去写会增加很多工作量,此时需要一种对数 ...

  6. Python爬虫xpath详解

    目录 一.xpath介绍 二.安装lxml 三.xpath解析原理 四.实例化一个etree对象 五.xpath表达式 六.爬虫实战 一.xpath介绍 xpath是一门在 XML 文档中查找信息的语 ...

  7. python爬虫xpath教程_使用 Xpath 进行爬虫开发

    使用 Xpath 进行爬虫开发 Xpath( XML Path Language, XML路径语言),是一种在 XML 数据中查找信息的语言,现在,我们也可以使用它在 HTML 中查找需要的信息. 既 ...

  8. python爬虫--xpath模块简介

    一.前言 前两篇博客讲解了爬虫解析网页数据的两种常用方法,re正则表达解析和beautifulsoup标签解析,所以今天的博客将围绕另外一种数据解析方法,它就是xpath模块解析,话不多说,进入内容: ...

  9. 表情包(图片)自生产——Python爬虫xpath实现

    文章目录 严正声明:爬虫应严格遵守国家的相关法律法规,坚决做一只文明爬虫 前言 一.知识准备 二.功能解析与实现 1.引入库 2.请求准备 3.发起请求 4.数据解析 5.数据保存 6.成果展示 三. ...

  10. python爬虫xpath教程

    环境准备: pycharm(撩妹神器,人手一个)   lxml(python的三方库) 如果电脑里没有安装lxml的伙伴,可以安装一下,在控制台输入pip intall https://pypi.do ...

最新文章

  1. 如何使用Python和Tkinter构建Toy Markdown编辑器
  2. 郑宇、沈抖领衔共话 AI 业界应用挑战 | IJCAI 2019
  3. 苏宁11.11:苏宁易购订单搜索系统架构及实现
  4. Nature:中国正在上演AI人才争夺战,中国公司在与Google竞争
  5. dataframe 删除首尾空格_你敲空格的速度很快,但女人的手不是用来敲空格的!...
  6. Appium--环境搭建
  7. 第 20 次 CSP认证 202009-5 密信与计数
  8. 处理兼容问题:对于某些css3属性需要加前缀?
  9. Rapid7 部分源代码遭泄露,成 Codecov 供应链攻击第四个受害者
  10. 解决苹果mac新建txt文档在Windows下不换行的方法
  11. Ubuntu——虚拟显示器的配置、卸载、修改分辨率
  12. Android MD5加密
  13. Oracle PLM,协同研发的产品生命周期管理平台
  14. 【VUE项目实战】40、添加商品分类功能(一)
  15. android 距离传感器 api,Android传感器API之:近距离感应Proximity功能源码
  16. 数据库作业4——数据查询
  17. geoserver给天地图添加服务,给线加标注
  18. JVM#Java高墙之内存模型
  19. css(精灵图和字体图标)
  20. UML的九种图+包图

热门文章

  1. 金测评 手感更细腻的游戏手柄,双模加持兼容更出色,雷柏V600S上手
  2. 如何用stc单片机内部ad采集多路交流信号
  3. java ssl是什么意思_java中SSL是什么?包括哪些内容?
  4. 数据分析——Tableau数据可视化与仪表盘搭建
  5. 产品经理必看书籍推荐《水平营销》
  6. 用html数据库搭建信息管理系统,Node.js实现简单管理系统
  7. 让我们来用php编写一个抢购商品脚本
  8. 集8年之大成,这本书与经典畅销书有着不解之缘
  9. ciObjectFactory::create_new_metadata
  10. 海康网络摄像头忘记密码_不要忘记网络性能