爬虫解析——Xpath的安装及使用(五)

目录

一、Xpath插件的安装

二、安装 lxml

三、Xpath解析文件

1.解析本地文件

(1)导入本地文件

(2)解析本地文件

2.服务器文件解析

(1)获取网页源码

(2)解析服务器响应文件

四、Xpath-抓取图片

1.设置url

2.请求对象定制

3.获取网页源码

 4.下载图片

5.调用

参考


Xpath可以解析两种文件

  • etree.parse() 解析本地文件:html_tree = etree.parse( 'xx.html')
  • etree.HTML()服务器响应文件:html_tree = etree.HTML(response.read( ).decode( utf-8")

Xpath基本语法

html_tree.xpath(xpath路经)

1.路径查询

        //: 查找所有子孙节点,不考虑层级关系(子和孙所有节点)

        /: 找直接子节点

2.谓词查询

        //div[@id]

        //div[@id="maincontent"]

3.属性查询

        //div/@class

4.模湖查询

        //div[contains(@id,"he")]

        //div[starts-with(@id,"he")]

5.内容查询

        //div/h1/text()

6.逻辑运算

        //div[@id="head” and @class="s_down"]

        //title | //price

一、Xpath插件的安装

进入chrome应用商店

搜索 Xpath helpler 

选择这个安装 

怎么看扩展是否安装成功呢?

随便打开一个页面,然后 按快捷键 Ctrl+Shift+X

出现这个黑色的框框就算安装成功了

二、安装 lxml

在环境中

pip install lxml

三、Xpath解析文件

1.解析本地文件

(1)导入本地文件

from lxml import etree# Xpath解析有两种解析文件
# 1.本地文件    etree.parse( 'xx.html')
# 2.服务器相应数据  response.read().decode('utf-8') 【主要用这个】    etree.HTML(response.read( ).decode("utf-8")tree = etree.parse('_070.html')
print(tree)

报错:

 需要将本地文件中的meta加一个结束标签

然后重新运行就可以了

(2)解析本地文件

本地的 HTML 文件 

内容查询
# text() 获取标签中的内容
# 路径查询
# 查找 ul 下面的 li
# li_list = tree.xpath('//body/ul/li')
li_list = tree.xpath('//body/ul/li/text()')
print(li_list)

 不用内容查询

使用内容查询

路径查询
# text() 获取标签中的内容
# 路径查询
# 查找 ul 下面的 li
li_list = tree.xpath('//body/ul/li/text()')
print(li_list)

谓词查询
# 谓词查询
# 查找所有有id属性的 <li> 标签
li_list = tree.xpath('//ul/li[@id]/text()')
print(li_list)

# 谓词查询
# 查找id为 ‘l1’ 的 <li> 标签
li_list = tree.xpath('//ul/li[@id="l1"]/text()')
print(li_list)

属性查询
# 属性查询
# 查询<li>标签的class属性的属性值
li_list = tree.xpath('//ul/li/@class')
print(li_list)

# 查询id 为 ‘l1’ 的<li>标签的class属性的属性值
li_list = tree.xpath('//ul/li[@id="l1"]/@class')
print(li_list)

模糊查询
# 模糊查询
# 查找 <li> 标签的id中包含 ‘l’ 的标签
li_list = tree.xpath('//ul/li[contains(@id,"l")]/text()')
print(li_list)

# 查找 <li> 标签的id中以‘s’开头的标签
li_list = tree.xpath('//ul/li[starts-with(@id,"s")]/text()')
print(li_list)

逻辑查询
# 逻辑运算
# 查询<li>标签中id为‘l1’且class的属性值为‘c1’的标签
li_list = tree.xpath('//ul/li[@id="l1" and @class="c1"]/text()')
print(li_list)

# 查询<li>标签中id为‘s1’或者class为‘c1’的标签
li_list = tree.xpath('//ul/li[@id="s1"]/text() | //ul/li[@class="c1"]/text()')
print(li_list)

2.服务器文件解析

(1)获取网页源码

# 1.获取网页的源码
url = 'https://www.baidu.com/'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}
# 请求对象定制
request = urllib.request.Request(url, headers=headers)
# 模拟客户端向服务器发送请求
response = urllib.request.urlopen(request)
# 获取网页源码
content = response.read().decode('utf-8')
print(content)

(2)解析服务器响应文件

# 解析服务器响应的文件
tree = etree.HTML(content)

我们应该如何获取Xpath呢?

之前安装的Xpath扩展就起作用了

我们 Ctrl + Shift + X打开扩展

右键页面打开检查,定位到“百度一下” 【我们要想要获取“百度一下”这个字段】

然后我们就可以根据检查中html标签的描述,在黑色框的左侧写 查询代码,右侧则显示查询结果,查询正确时,右侧框中则会出现你想要的东西,我们复制这个Xpath路径。

将复制的Xpath路径填入代码,运行就可以看到,我们已经成功获取了“百度一下这个字段”

# 打印
result= tree.xpath('//input[@id="su"]/@value')
print(result)

还有一种获取Xpath的方法

右键网页,点击检查,点击箭头,然后选中页面中“百度一下”这个框,检查中就会点位到这个框的位置,然后右键这个位置,选择copy,选择copy Xpath,就会得到一个定位到百度一下这个框的代码  //*[@id="su"]

然后补充自己想要获取的值(@value)就可以

result = tree.xpath('//*[@id="su"]/@value')
print(result)

本地文件解析完整代码:

from lxml import etree# Xpath解析有两种解析文件
# 1.本地文件    etree.parse( 'xx.html')
# 2.服务器相应数据  response.read().decode('utf-8') 【主要用这个】    etree.HTML(response.read( ).decode("utf-8")##############################
########   本地文件解析 ########
#############################
# 导入 本地html文件
tree = etree.parse('_070.html')# text() 获取标签中的内容
# 路径查询
# 查找 ul 下面的 li
# li_list = tree.xpath('//body/ul/li/text()')# 谓词查询
# 查找所有有id属性的 <li> 标签
# li_list = tree.xpath('//ul/li[@id]/text()')
# 查找id为 ‘l1’ 的 <li> 标签
# li_list = tree.xpath('//ul/li[@id="l1"]/text()')# 属性查询
# 查询<li>标签的class属性的属性值
# li_list = tree.xpath('//ul/li/@class')
# 查询id 为 ‘l1’ 的<li>标签的class属性的属性值
# li_list = tree.xpath('//ul/li[@id="l1"]/@class')# 模糊查询
# 查找 <li> 标签的id中包含 ‘l’ 的标签
# li_list = tree.xpath('//ul/li[contains(@id,"l")]/text()')
# 查找 <li> 标签的id中以‘s’开头的标签
# li_list = tree.xpath('//ul/li[starts-with(@id,"s")]/text()')# 逻辑运算
# 查询<li>标签中id为‘l1’且class的属性值为‘c1’的标签
# li_list = tree.xpath('//ul/li[@id="l1" and @class="c1"]/text()')
# 查询<li>标签中id为‘s1’或者class为‘c1’的标签
li_list = tree.xpath('//ul/li[@id="s1"]/text() | //ul/li[@class="c1"]/text()')
print(li_list)

服务器文件解析完整代码:

from lxml import etree
import urllib.request###############################
####### 解析服务器文件 ##########
################################ 1.获取网页的源码
url = 'https://www.baidu.com/'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}
# 请求对象定制
request = urllib.request.Request(url, headers=headers)
# 模拟客户端向服务器发送请求
response = urllib.request.urlopen(request)
# 获取网页源码
content = response.read().decode('utf-8')# 2.解析服务器响应文件
# 解析服务器响应的文件
tree = etree.HTML(content)# 打印 Xpath 的返回值是一个列表类型的数据
# result= tree.xpath('//input[@id="su"]/@value')
result = tree.xpath('//*[@id="su"]/@value')
print(result)

四、Xpath-抓取图片

抓取站长素材网站的图片

1.设置url

查找每一页 url 的规律

# 找 url 的规律
# url : https://sc.chinaz.com/tupian/cixiutuan.html  page = 1
# url : https://sc.chinaz.com/tupian/cixiutuan_2.html  page = 2
# url : https://sc.chinaz.com/tupian/cixiutuan_3.html  page = 3

2.请求对象定制

def create_request(page):if page == 1:url = 'https://sc.chinaz.com/tupian/cixiutuan.html'else:url = 'https://sc.chinaz.com/tupian/cixiutuan_'+str(page)+'.html'headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"}request = urllib.request.Request(url, headers=headers)return  request

3.获取网页源码

def get_content(request):response = urllib.request.urlopen(request)content = response.read().decode('utf-8')return content

 4.下载图片

通过Xpath获取图片的链接和图片名称

右键检查 --> 定位到图片的标签行 --> 在Xpath扩展的左侧框中写入Xpath --> 右侧与想要的数据吻合 --> 复制这个Xpath

但是!!!有时候在网页上获取的Xpath和通过response获取Xpath是不一样的,如果没有返回内容,就把网页下载下来看一下Xpath。

有时候src并不是真实的路径,可能会在‘data-original’中,重点是要检查content中的内容

有的网站也会存在懒加载,src的属性就会变成src2,这个问题就需要根据从content和页面多加辨别。

def download(content):# 下载图片# urllib.request.urlretrieve('图片地址', '图片名称')  # 这两项我们都没有,那我们就要先获取tree = etree.HTML(content)src_list = tree.xpath('//div[@class="tupian-list com-img-txt-list"]/div/img/@data-original')name_list = tree.xpath('//div[@class="tupian-list com-img-txt-list"]/div/img/@alt')for i in range(len(name_list)):name = name_list[i]src = src_list[i]url = 'https:' + srcurllib.request.urlretrieve(url=url, filename='_072_download_img/'+name+'.png')

5.调用

start_page = int(input('请输入起始页码'))
end_page = int(input('请输入结束页码'))
for page in range(start_page, end_page+1):# 请求对象定制response = create_request(page)# 获取网页源码content = get_content(response)# 下载download(content)

完整代码:

# 站长素材 https://sc.chinaz.com/
# 站长素材 --> 高清图片 --> 选择一个 --> 下载前十页import urllib.request
from lxml import etree# 找 url 的规律
# url : https://sc.chinaz.com/tupian/cixiutuan.html  page = 1
# url : https://sc.chinaz.com/tupian/cixiutuan_2.html  page = 2
# url : https://sc.chinaz.com/tupian/cixiutuan_3.html  page = 3def create_request(page):if page == 1:url = 'https://sc.chinaz.com/tupian/cixiutuan.html'else:url = 'https://sc.chinaz.com/tupian/cixiutuan_'+str(page)+'.html'headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"}request = urllib.request.Request(url, headers=headers)return requestdef get_content(request):response = urllib.request.urlopen(request)content = response.read().decode('utf-8')return contentdef download(content):# 下载图片# urllib.request.urlretrieve('图片地址', '图片名称')  # 这两项我们都没有,那我们就要先获取tree = etree.HTML(content)src_list = tree.xpath('//div[@class="tupian-list com-img-txt-list"]/div/img/@data-original')name_list = tree.xpath('//div[@class="tupian-list com-img-txt-list"]/div/img/@alt')for i in range(len(name_list)):name = name_list[i]src = src_list[i]url = 'https:' + srcurllib.request.urlretrieve(url=url, filename='_072_download_img/'+name+'.png')start_page = int(input('请输入起始页码'))
end_page = int(input('请输入结束页码'))
for page in range(start_page, end_page+1):# 请求对象定制response = create_request(page)# 获取网页源码content = get_content(response)# 下载download(content)

参考

尚硅谷Python爬虫教程小白零基础速通(含python基础+爬虫案例)

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

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

相关文章

力扣373. 查找和最小的 K 对数字

优先队列 思路&#xff1a; 使用下标 (x, y) 标识数值对&#xff0c;x 为第一个数组的下标&#xff0c;y 为第二个数组的下标&#xff1b;所以 k 个数值对 x 的范围属于 [0, min(k, m)]&#xff0c;m 为第一个数组的 size&#xff1b;数值对 (x, y) &#xff0c;那么下一个比其…

TailwindCSS 如何处理RTL布局模式

背景 TikTok作为目前全世界最受欢迎的APP&#xff0c;需要考虑兼容全世界各个地区的本地化语言和阅读习惯。其中对于阿拉伯语、波斯语等语言的阅读书写习惯是从右向左的&#xff0c;在前端有一个专有名字RTL模式&#xff0c;即Right-to-Left。 其中以阿拉伯语作为第一语言的人…

C# 获取windows 系统开关机时间

关机时间&#xff0c;引用&#xff1a;https://www.coder.work/article/1589448 public static DateTime GetLastSystemShutdown() { string sKey "System\CurrentControlSet\Control\Windows"; Microsoft.Win32.RegistryKey key …

建立个人学习观|地铁上的自习室

作者&#xff1a;向知 如果大家有机会来北京&#xff0c;可以来看看工作日早上八九点钟&#xff0c;15 号线从那座叫“顺义”的城市通向“望京”的地铁&#xff0c;你在那上面&#xff0c;能看到明明白白的&#xff0c;人们奔向梦想的模样。 一、地铁上的自习室 我在来北京之前…

华为数据之道学习笔记】3-5 规则数据治理

在业务规则管理方面&#xff0c;华为经常面对“各种业务场景业务规则不同&#xff0c;记不住&#xff0c;找不到”“大量规则在政策、流程等文件中承载&#xff0c;难以遵守”“各国规则均不同&#xff0c;IT能否一国一策、快速上线”等问题。 规则数据是结构化描述业务规则变量…

【算法集训】基础数据结构:三、链表

链表就是将所有数据都用一个链子串起来&#xff0c;其中链表也有多种形式&#xff0c;包含单向链表、双向链表等&#xff1b; 现在毕竟还是基础阶段&#xff0c;就先学习单链表吧&#xff1b; 链表用头结点head表示一整个链表&#xff0c;每个链表的节点包含当前节点的值val和下…

2024 年顶级的 Android 系统修复软件与方法

您是否正在寻找可以修复 PC 上 Android 操作系统的工具&#xff1f;这是我们精选的最好的 Android 系统修复软件&#xff01; Android 是世界著名的智能手机操作系统。全世界有数百万人使用这个操作系统&#xff0c;这使得它安全可靠。然而&#xff0c;这仍然不能使它完美无缺…

048:利用vue-video-player播放m3u8

第048个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

普冉(PUYA)单片机开发笔记(6): 呼吸灯

概述 上一篇的实验中&#xff0c;分别正确地配置了 TIM16 和 TIM1&#xff0c;TIM16 的中断服务程序中每隔 500ms 翻转板载 LED 一次&#xff1b;TIM1 的 CHANNEL_1 用于输出一个固定占空比的 PWM 信号。这一次我们进一小步&#xff1a;使用 TIM16 的中断设置 TIM1 CHANNEL_1 …

MyBatis进阶之分页和延迟加载

文章目录 分页1. RowBounds 分页2. PageHelper 分页3. PageInfo 对象属性描述 延迟加载立即加载激进式延迟加载真-延迟加载 分页 Mybatis 中实现分页功能有 3 种途径&#xff1a; RowBounds 分页&#xff08;不建议使用&#xff09;Example 分页&#xff08;简单情况可用)Pag…

关于对向量检索研究的一些学习资料整理

官方学习资料 主要是的学习资料是&#xff0c; 官方文档 和官方博客。相关文章还是挺多 挺不错的 他们更新也比较及时。有最新的东西 都会更新出来。es scdn官方博客 这里简单列一些&#xff0c;还有一些其他的&#xff0c;大家自己感兴趣去看。 什么是向量数据库 Elasticse…

文件加密软件哪个最好用 好用的文件加密软件推荐

一说到文件加密软件&#xff0c;可能大家都会去搜一些不知名的软件来&#xff0c;但是选择这种加密软件&#xff0c;最好还是要看一些资质的。 资质不好的&#xff0c;可能加密过后你自己也打不开文件&#xff0c;&#xff08;ps&#xff1a;我自己就遇到过这种情况&#xff09…

【华为OD机试python】分苹果【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 A、B两个人把苹果分为两堆,A希望按照他的计算规则等分苹果, 他的计算规则是按照二进制加法计算,并且不计算进位 12+5=9(1100 + 0101 = 9), B的计算规则是十进制加法,包括正常进位,…

基于Java SSM框架高校校园点餐订餐系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架高校校园点餐订餐系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&a…

(一)Java 基础语法

目录 一. 前言 二. Hello World 三. Java 语法 3.1. 基本语法 3.2. Java 标识符 3.3. Java 修饰符 3.4. Java 变量 3.5. Java 数组 3.6. Java 枚举 3.7. Java 关键字 3.8. Java 注释 3.9. Java 空行 3.10. Java 继承 3.11. Java 接口&#xff08;interface&#…

Oracle(2-14)User-Managed Incomplete Recovery

文章目录 一、基础知识1、Incomplete Recovery Overview 不完全恢复概述2、Situations Requiring IR 需要不完全恢复的情况3、Types of IR 不完全恢复的类型4、IR Guidelines 不完全恢复指南5、User-Managed Procedures 用户管理程序6、RECOVER Command Overview 恢复命令概述7…

算法训练营Day8(字符串)

344.反转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; class Solution {public void reverseString(char[] s) {for(int i 0,j s.length-1;i< s.length/2 ; i,j--){swap(s,i,j);}}public void swap(char[] s,int i,int j ){char temp s[i];s[i] s[j]…

Python数据科学视频讲解:Python注释

2.3 Python注释 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解2.3节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&#xff0c;包括数据科学应用和…

20231210原始编译NanoPC-T4(RK3399)开发板的Android10的SDK

20231210原始编译NanoPC-T4(RK3399)开发板的Android10的SDK 2023/12/10 17:27 rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ mkdir nanopc-t4 rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ cd nanopc-t4/ …

python4E 之 Dict 找到两个不同索引但都需要对应的值。

找到两个不同索引但都需要&#xff0c;对应的值。 df pd.DataFrame(np.random.randint(1, 10, [3,3]), columns list(ABC)) 通过 dict 制造key index_htable{} for _,row in idc.iterrows(): #按行循环 key str(row[u股票代码]) | str(row[u日期]) #根据不同 的索引…