【Python】爬虫-Xpath
Xpath
文章参考:https://www.cnblogs.com/mxjhaima/p/13775844.html#案例
安装
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.html
html = 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> 包裹的内容 ,上一行获取的当前节点为 html
print('获取 根节点 标签---> ', 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-1
print('获取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开始 而不是0
print(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.text
print('输出响应信息->',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的语法
有朋友问我正则,,okey,其实我的正则也不好,但是python下xpath是相对较简单的 简单了解一下xpath: XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML ...
- python爬虫xpath
又是一个大晴天,因为马上要召开十九大,北京地铁就额外的拥挤,人贴人到爆炸,还好我常年挤地铁早已练成了轻功水上漂,挤地铁早已经不在话下. 励志成为一名高级测试工程师的我,目前还只是个菜鸟,难得有机会,公 ...
- Python爬虫 XPath语法和lxml模块
XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ...
- python爬虫----XPath
1.知道本节点元素,如何定位到兄弟元素 详情见博客 XML代码见下 bt1在文档中只出现一次,所以很容易获取到bt1中内容,那怎么根据<td class='bt1'>来获取bt2中的内容 ...
- Python爬虫 | xpath的安装
错误信息:程序包无效.详细信息:“Cannot load extension with file or directory name . Filenames starting with "& ...
- python爬虫前提技术
1.BeautifulSoup 解析html如何使用 转自:http://blog.csdn.net/u013372487/article/details/51734047 #!/usr/bin/py ...
- Python爬虫与数据分析之爬虫技能:urlib库、xpath选择器、正则表达式
专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...
- python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)
一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...
- Python爬虫教程-22-lxml-etree和xpath配合使用
Python爬虫教程-22-lxml-etree和xpath配合使用 lxml:python 的HTML/XML的解析器 官网文档:https://lxml.de/ 使用前,需要安装安 lxml 包 ...
- 小白学 Python 爬虫(19):Xpath 基操
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
随机推荐
- 从零开始学Vue(一)—— Vue.js 入门
概述 vue.js作为现在笔记热门的JS框架,使用比较简单易上手,也成为很多公司首选的JS框架. 但是对于初学者可能学起来有些麻烦,所以推出<从零开始学Vue>系列博客,本系列计划推出19 ...
- memcache 安装及操作
memcache安装文件下载 http://pan.baidu.com/s/1hqRdW1Y 一 安装篇 1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:/memcach ...
- 最好用的.NET敏捷开发框架-RDIFramework.NET V3.6版全新发布 100%源码授权
RDIFramework.NET,基于.NET的快速信息化系统敏捷开发框架.10年沉淀.历经上千项目检验,致力于企业智能化开发,帮助提升软件开发效率.最好用的.NET开发框架,100%源码授权. 1. ...
- python_7 退出、结束循环和嵌套循环
一.查缺补漏 1. end=' 任意值 ' 表示换行,任意值会显示在换行前,不写默认换行 2. input() 用户键盘输入 默认输入str类型,如要和int类型比较需要强制类型转换二.退出.结束循环 ...
- vue路由的两种方式(路由传参)
query和params区别 query类似 get, 跳转之后页面 url后面会拼接参数,类似?id=1, 非重要性的可以这样传, 密码之类还是用params刷新页面id还在 params类似 po ...
- Html 设置标题栏顶部固定
如何设置标题栏一直置顶固定显示? 只需要给标题栏所在的容器,以下设置: position: fixed; top: 0px; left: 0px; width: 100%; 位置固定在 ...
- NC19427 换个角度思考
题目链接 题目 题目描述 给定一个序列,有多次询问,每次查询区间里小于等于某个数的元素的个数 即对于询问 \((l,r,x)\) ,你需要输出 \(\sum_{i=l}^{r}[a_i \le x]\ ...
- 【解决方法】白嫖利用WPS自带C盘清理大师,清理C盘空间,自测清理19.5G空间,太感人了!
环境: 工具:WPS-WPS清理大师 系统版本:Windows 10 问题描述: 描述:本人C盘常年不足10G,也用过一些其他的清理工具,但是也不懂,不敢乱删除东西.一直得过且过. 由于C盘中有很多的 ...
- 【OpenAI】私有框架代码生成实践
作者:京东零售 牛晓光 根据现有调研和实践,由OpenAI提供的ChatGPT/GPT-4模型和CodeX模型能够很好的理解和生成业界大多数编程语言的逻辑和代码,其中尤其擅长Python.JavaSc ...
- 2021-12-09:二叉树展开为链表。 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左
2021-12-09:二叉树展开为链表. 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左 ...