爬虫解析——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.hqwc.cn/news/266776.html

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

相关文章

SQL进阶 | 自连接

概述 SQL的自连接是指在一个SQL表中&#xff0c;使用自身表格中的实例进行联接并查询的操作。自连接通常使用别名来标识一个表格&#xff0c;在自连接中&#xff0c;表格被视为两个不同的表格&#xff0c;并分别用不同的别名来标识。然后&#xff0c;在WHERE子句中使用这些别名…

【c】数组元素移动

本题的难点之处就是不让你创建新的数组&#xff0c;而且移动的距离也没有给限制&#xff0c;比如有7个数&#xff0c;本题没有限制必须移动距离小于7&#xff0c;也可能移动的距离大于7&#xff0c;甚至更多&#xff0c;下面附上我的代码 #include<stdio.h>int main() {…

ERA5逐时、逐日、逐月气象数据的手动下载与Python代码批量下载方法

本文介绍在ERA5气象数据的官方网站中&#xff0c;手动下载、Python代码自动批量下载逐小时、逐日与逐月的ERA5气象数据各类产品的快捷方法。 ERA5&#xff08;fifth generation ECMWF atmospheric reanalysis of the global climate&#xff09;是由欧洲中期天气预报中心&#…

千帆竞渡,鸿蒙已过万重山

近期&#xff0c;华为宣布其自主研发的鸿蒙Next系统将不再兼容Android系统&#xff0c;而是完全独立运营。 也就是说&#xff0c;你的 Android APK 已经不能在 HarmonyOS NEXT 上运行&#xff0c;因为系统已经不存在 AOSP 代码&#xff0c;甚至没有 JVM。 此举意味着鸿蒙系统…

SSD在AI发展中的关键作用:从高速缓存到数据湖-1

随着人工智能技术的飞速发展&#xff0c;存储在其中发挥着至关重要的作用。特别是在AI训练过程中&#xff0c;存储SSD&#xff08;固态硬盘&#xff09;的高性能和可靠性对于提升训练效率和保证数据安全具有不可替代的作用。 存储SSD在AI发展中的作用和趋势&#xff0c;存储将…

css的介绍与实战(有实现案例)

目录 css的简单介绍 css的基础选择器 css的字体属性&#xff08;背下来&#xff09; css的文本属性&#xff08;背下来&#xff09; css的引入方式&#xff08;背下来&#xff09; 实战案例 css的简单介绍 HTML 的局限性 说起 HTML&#xff0c;这其实是个非常单纯的家伙…

mmyolo的bbox_loss和检测bbox都是空

最近用mmyolo训练自己的数据集的时候发现训练的时候loss_bbox0&#xff0c;测试和eval的时候结果也全是空的&#xff0c;排除了数据集读取的问题&#xff0c;最后发现是config中自定义了自己的类别但是没有传给dataset。。。 简而言之&#xff0c;在自定义了数据集里的metainf…

【语义分割数据集】——imagenet语义分割

地址&#xff1a;https://github.com/LUSSeg/ImageNet-S 1 例图 2. 类别和数量信息 疑问 根据原文的描述&#xff1a;Based on the ImageNet dataset, we propose the ImageNet-S dataset with 1.2 million training images and 50k high-quality semantic segmentation annot…

微服务网关组件Gateway实战

1. 需求背景 在微服务架构中&#xff0c;通常一个系统会被拆分为多个微服务&#xff0c;面对这么多微服务客户端应该如何去调用呢&#xff1f;如果根据每个微服务的地址发起调用&#xff0c;存在如下问题&#xff1a; 客户端多次请求不同的微服务&#xff0c;会增加客户端代码…

Python数值类型(整形、浮点型和复数)及其用法

数值类型是计算机程序最常用的一种类型&#xff0c;既可用于记录各种游戏的分数、游戏角色的生命值、伤害值等&#xff0c;也可记录各种物品的价格、数量等&#xff0c;Python 提供了对各种数值类型的支持&#xff0c;如支持整型、浮点型和复数。 Python整型 Python 3 的整型…

二手车选购参考:杜卡迪Monster 欧系街车的代表,Ducati的销冠。

哈喽大家好&#xff0c;有几天没给大家更新二手车系列了&#xff0c;主要是一时之间想不到特别好的车型&#xff0c;因为预算的关系&#xff0c;所以我们这个栏目的售价将会卡在4~5万元左右&#xff0c;是国内绝大多数人努力都可以够得着的价格&#xff0c;也是国产中大排的新车…

排程系统中关于任务优先级的需求延伸与设计构思

无论是面向销售订单的MPS&#xff0c;还是基于多工序制约关系的APS&#xff0c;还是具体车间生产中针对单一工序的任务作业调度优化&#xff0c;都存在基于被排程对象(例如销售订单、生产工单、工序任务)的优先级进行优化的需求场景。当我们仅在宏观、较高层次的角度考虑&#…