爬虫解析——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,一经查实,立即删除!

相关文章

TailwindCSS 如何处理RTL布局模式

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

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

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

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

链表就是将所有数据都用一个链子串起来&#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;模板使…

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…

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

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

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…

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/ …

【AIE】AIE微信合集

AIE微信合集 AIE(1) 对于Versal&#xff0c;我们从系统角度看&#xff0c;可将其分为3个Domain&#xff1a;AIE、PS和PL&#xff0c;如下图所示。如果要运行一个AIE的应用&#xff0c;绝大多数情况下&#xff0c;这3个Domain我们都会用到&#xff0c;使其协同工作。这里我们仅…

《绝地求生》新手怎么玩 游戏基本介绍

随着电竞热潮的兴起&#xff0c;《绝地求生》已经成为了一款备受玩家热爱的游戏。这款游戏在全球范围内拥有庞大的玩家群体&#xff0c;它将你置身于一个荒无人烟的岛屿上&#xff0c;与其他99名玩家展开生死竞争。作为一个新手&#xff0c;下面闲游盒小盒子就为大家详细介绍一…

写实3D游戏模型纹理贴图设置

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xff1a; …

Mybatis源码解析5:Mapper执行流程1

Mybatis源码解析5&#xff1a;Mapper执行流程1 1.项目结构2. 源码分析2.1 Mapper代理 MapperProxy#invoke2.2 创建MapperMethod2.2.1 方法名称解析器ParamNameResolve2.2.2 MapperMethod#execute 2.3 DefaultSqlSession2.4 CachingExecutor2.5 SimpleExecutor#doQuery获取连接对…

Nacos源码解读09——配置中心配置信息创建修改怎么处理的

存储配置 从整体上Nacos服务端的配置存储分为三层&#xff1a; 内存&#xff1a;Nacos每个节点都在内存里缓存了配置&#xff0c;但是只包含配置的md5&#xff08;缓存配置文件太多了&#xff09;&#xff0c;所以内存级别的配置只能用于比较配置是否发生了变更&#xff0c;只用…

进行生成简单数字图片

1.之前只能做一些图像预测,我有个大胆的想法,如果神经网络正向就是预测图片的类别,如果我只有一个类别那就可以进行生成图片,专业术语叫做gan对抗网络 2.训练代码 import torch import torch.nn as nn import torch.optim as optim import torchvision.transforms as transfo…

盛域宏数合伙人张天:AI时代,数字化要以AI重构

大数据产业创新服务媒体 ——聚焦数据 改变商业 在这个飞速发展的科技时代&#xff0c;数字化已经深刻地改变了我们的生活和商业方式。信息技术的迅猛发展使得数据成为现代社会最宝贵的资源之一。数字化已经不再是可选项&#xff0c;而是企业持续发展的必由之路。背靠着数据的…

【React】路由的基础使用

react-router-dom6的基础使用 1、安装依赖 npm i react-router-dom默认安装最新版本的 2、在src/router/index.js import { createBrowserRouter } from "react-router-dom"/* createBrowserRouter&#xff1a;[/home]--h5路由createHashRouter&#xff1a;[/#/ho…