Python爬虫,初识xpath(1)

xpath解析

抓取主页面当中所有壁纸的链接地址

xpath是专门针对xml而创建的表达式语言,可以直接从xml中提取表达式数据;也可以取html取数据;html是xml的子集。

1.按照lxml安装包

在python终端输入 pip install lxml

from lxml import etree
# 或者
# from lxml import html
# etree = html.etree
​
# 需要加载准备解析的数据
f = open("text.html",mode="r",encoding='utf-8')
pageSource = f.read()
#print(pageSource)
​
# 加载数据,返回element对象
et = etree.HTML(pageSource)
# print(et)  <Element html at 0x1f349424980>
​
# 从elemnt提取界面所有内容
# xpath的语法
result = et.xpath("/html/body/span/text()")  # text()提取标签中的文本信息
print(result)

加载需要解析的html文件,但要提取数据要定位html的<>内容,例如

text.html,"/html/body/span/"定位到<span>我爱你</span》内容,那么要提取里面文本需要加上给text(),即可提取定位位置的文本信息

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><span>我爱你</span>
​<ul><li><a href="http://www.baidu.com">百度</a></li><li><a href="http://www.google.com">谷歌</a></li><li><a href="http://www.sohu.com">搜孤</a></li></ul><ol><li><a href="http://feiji">飞机</a></li><li><a href="http://dapao">大炮</a></li><li><a href="http://huoche">火车</a></li></ol><div class="job">浙江</div><div class="common">美女</div></body>
</html>

<a href= >XX</a>超链接,XX是展示在页面上的文字,用户可以点击,点击后就跳转到href=的链接地址

需求:提取超链接中的文字(百度,谷歌,搜狐被<ul>包围,飞机,大炮,火车被<ol>包围写两个提取信息代码或者使用通配符*)

(* 通配符,什么都可以,满足后面即可)

result = et.xpath("/html/body/*/li/a/text()")
print(result)
# 输出结果  ['百度', '谷歌', '搜孤', '飞机', '大炮', '火车']

需求:提取a标签中的属性,提取代码中的超链接,使用@href,提取html中的链接地址

@表示属性,@href提取a标签中的href属性

# 提取a标签中的属性,即超链接  
result = et.xpath("/html/body/*/li/a/@href") #@表示属性,@href提取a标签中的href属性
print(result)
# 输出结果:['http://www.baidu.com', 'http://www.google.com', 'http://www.sohu.com', 'http://feiji', 'http://dapao', 'http://huoche']

优化:欠缺提取信息的索引太多,可以使用//优化,,//表示任意位置

result = et.xpath("//a/@href")   # //表示任意位置
print(result)
# 输出结果:['http://www.baidu.com', 'http://www.google.com', 'http://www.sohu.com', 'http://feiji', 'http://dapao', 'http://huoche']

限定:假如要提取div中的信息,并且只要浙江,不要美女,要对div中class属性进行限定,即可提取自己想要的信息,而不是把符合div的数据全部提取

[@属性=‘’]在属性上限定,不把符合div的数据全部提出

result = et.xpath("//div[@class='job']/text()")    # [@属性=‘’]在属性上限定,不把符合div的数据全部提出
print(result)
# 输出:['浙江']

需求:要ul中的信息,并且要求文本和属性一一对应;

思路:对li进行遍历,逐个提取各li中的所有信息 ./表示当前元素

# 带循环的
result = et.xpath("/html/body/ul/li")
for item in result:href = item.xpath("./a/@href")[0]    # ./表示当前元素text = item.xpath("./a/text()")[0]   # ./表示当前元素print(href,text)
# 输出结果
# http://www.baidu.com 百度
# http://www.google.com 谷歌
# http://www.sohu.com 搜孤

主页面分析

</li><li class="photo-list-padding"><a class="pic" href="[/bizhi/3114_39082_2.html](https://desk.zol.com.cn/bizhi/3114_39082_2.html)" target="_blank" hidefocus="true"><span title="小黄人可爱高清壁纸大全">小黄人可爱高清壁纸大全

找数据,先找a标签,查看a标签中的href数据,点入确定照片

  1. 拿到页面源代码

  2. 提取所有a标签中的href数据,要对a标签中的内容进行限定,我们这里要

中的内容,即提取ul>li>a标签中的href的值

问题及解决方法

1.如果出现乱码,则查看源代码的编码方式,图中为gb2312,即gbk编码,我们把encode改一下就行。

2.如果出现503 Service Unavailable 尝试把请求头信息一致即可完成。

import requests
from lxml import etree
​
# 提取源代码
url = "https://desk.zol.com.cn/dongman/good_1.html"
head = {
"user-agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0"
​
}
​
resp = requests.get(url,headers=head)
resp.encoding = 'gbk'
txt = resp.text
# print(txt)
​
# 提取代码中的href信息
# <ul class="pic-list2  clearfix">  <li class="photo-list-padding">
et = etree.HTML(txt)
result = et.xpath('//ul[@class="pic-list2  clearfix"]/li/a/@href')
print(result)
​
#输出结果
#['https://down10.zol.com.cn/desktoptools/XZDesktop_5018_3.1.3.6.exe', #'//desk.zol.com.cn/bizhi/9109_111583_2.html', '/bizhi/8676_107002_2.html', #'/bizhi/8530_105480_2.html', '/bizhi/8376_103851_2.html', #'/bizhi/8365_103747_2.html', '/bizhi/8339_103479_2.html', #'/bizhi/8336_103439_2.html', '/bizhi/8317_103216_2.html', #'/bizhi/8287_102877_2.html', '/bizhi/8286_102865_2.html', #'/bizhi/8280_102793_2.html', '/bizhi/8264_102617_2.html', #'/bizhi/8263_102613_2.html', '/bizhi/8261_102593_2.html', #'/bizhi/8260_102585_2.html', '/bizhi/8246_102427_2.html', #'/bizhi/8245_102410_2.html', '/bizhi/8242_102394_2.html', #'/bizhi/8234_102309_2.html', '/bizhi/8231_102269_2.html']

但是现在的链接无法打开图片,缺少域名

所以,加上:

domin = "https://desk.zol.com.cn"
for item in result:url = domin+itemprint(url)

所有代码:

import requests
from lxml import etree
​
# 提取源代码
url = "https://desk.zol.com.cn/dongman/good_1.html"
head = {
"user-agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0"
​
}
​
resp = requests.get(url,headers=head)
resp.encoding = 'gbk'
txt = resp.text
print(txt)
​
​
# 提取代码中的href信息
# <ul class="pic-list2  clearfix">  <li class="photo-list-padding">
et = etree.HTML(txt)
result = et.xpath('//ul[@class="pic-list2  clearfix"]/li/a/@href')
print(result)
domin = "https://desk.zol.com.cn"
for item in result:url = domin+itemprint(url)

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

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

相关文章

【element-tiptap】如何实现查找替换功能?

这是一个稍微复杂的功能了&#xff0c;因为 element-tiptap 中没有查找替换功能&#xff0c;需要从零开始开发。但是&#xff0c;在万能的github上有一个开源的库&#xff0c;我们可以借用一下 tiptap-search-and-replace 不过这个库是没有UI的&#xff0c;只有一个扩展的方法。…

【Linux】线程池详解及其基本架构与单例模式实现

目录 1.关于线程池的基本理论 1.1.线程池是什么&#xff1f; 1.2.线程池的应用场景&#xff1a; 2.线程池的基本架构 2.1.线程容器 2.2.任务队列 2.3.线程函数&#xff08;HandlerTask&#xff09; 2.4.线程唤醒机制 3.添加单例模式 3.1.单例模式是什么&…

【 thinkphp8 】00006 启动 内、外置服务器

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【 t…

Linux文件类型和根目录结构

Linux文件类型和根目录结构 1.文件类型 字符文件类型说明~普通文件类似于Windows的记事本d目录文件类似于windows文件夹c字符设备文件串行端口设备&#xff0c;顺序读写&#xff0c;键盘b块设备文件可供存储的接口设备&#xff0c;随机读写&#xff0c;硬盘p管道文件用于进程…

jmeter中请求参数:Parameters、Body Data的区别

使用jmeter发送请求&#xff0c;常常要伴随传递参数。有两种请求参数: Parameters, Body Data, 它们的使用方式有很大不同。 先看下get和post请求的区别。 get请求&#xff1a;顾名思义是从服务器获取资源。 post请求&#xff1a;顾名思义是往服务器提交要处理的数据。 直观…

【算法刷题指南】双指针

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

JavaSE要点 1】Java基础

目录 一、编译和运行 二、JDK,JRE和JVM 三、Java中的基本类型 1. 基本类型的大小 四、JVM内存模型 1. 内存模型 五、JVM虚拟机的组成 1. 虚拟机的5个组成部分 2. 虚拟机栈 3. 栈帧 六、值传递和引用传递 七、变量的默认值 八、String的不可变 九. 包装类和常量池&#xff08;-…

基于SSM的网上购物系统的设计与实现

技术介绍 本系统运用了JSP技术、SSM框架、B/S架构和myspl数据库 MySQL 介绍 MySQL是一种关系型的数据库管理系统&#xff0c;属于Oracle旗下的产品。MySQL的语言是非结构化的&#xff0c;使用的用户可以在数据上进行工作。这个数据库管理系统一经问世就受到了社会的广泛关注…

【WebGis开发 - Cesium】三维可视化项目教程---图层管理拓展图层顺序调整功能

目录 引言一、为什么要开发图层顺序调整功能二、开发思路整理1. 拖拽库方案选择2. cesium图层api查询 三、代码编写1. 编写拖拽组件代码2. 修改原有图层管理代码2.1 图层加载移除的调整2.2 图层顺序与拖拽列表的矛盾 3. 编写图层移动代码 四、总结 引言 本教程主要是围绕Cesium…

深入理解InnoDB底层原理:从数据结构到逻辑架构

💡 无论你是刚刚踏入编程世界的新人,还是希望进一步提升自己的资深开发者,在这里都能找到适合你的内容。我们共同探讨技术难题,一起进步,携手度过互联网行业的每一个挑战。 📣 如果你觉得我的文章对你有帮助,请不要吝啬你的点赞👍分享💕和评论哦! 让我们一起打造…

ctfshow(259->261)--反序列化漏洞--原生类与更多魔术方法

Web259 进入界面&#xff0c;回显如下&#xff1a; highlight_file(__FILE__);$vip unserialize($_GET[vip]); //vip can get flag one key $vip->getFlag();题干里还提示了网站有一个flag.php界面&#xff0c;源代码如下&#xff1a; $xff explode(,, $_SERVER[HTTP_X…

常见的音视频格式介绍

目录 aac格式介绍&#xff08;ADTS&#xff09;h264格式分析FLV和MP4格式介绍 aac格式介绍&#xff08;ADTS&#xff09; aac的格式有两种&#xff1a;ADIF不常用&#xff0c;ADTS是主流&#xff0c;所以这里主要讲解ADTS。简单来说&#xff0c;ADTS可以在任意帧解码&#xff…

校园表白墙源码修复版

此校园表白墙源码基于thinkphp&#xff0c;因为时代久远有不少bug&#xff0c;经本人修复已去除大部分bug&#xff0c;添加了美化元素。 https://pan.quark.cn/s/1f9b3564c84b https://pan.baidu.com/s/1bb9vu9VV2jJoo9-GF6W3xw?pwd7293 https://caiyun.139.com/m/i?2hoTc…

多款云存储平台存在安全漏洞,影响超2200万用户

据苏黎世联邦理工学院研究人员Jonas Hofmann和Kien Tuong Turong的发现&#xff0c;端到端加密&#xff08;E2EE&#xff09;云存储平台存在一系列安全问题&#xff0c;可能会使用户数据暴露给恶意行为者。在通过密码学分析后&#xff0c;研究人员揭示了Sync、pCloud、Icedrive…

三维管线管网建模工具MagicPipe3D V3.5.3

经纬管网建模系统MagicPipe3D&#xff0c;本地离线参数化构建地下管网三维模型&#xff08;包括管道、接头、附属设施等&#xff09;&#xff0c;输出标准3DTiles、Obj模型等格式&#xff0c;支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、语义查询、专题分析&…

【Android】MVP架构

MVP架构简介 MVP&#xff08;Model-View-Presenter&#xff09;是一种常见的软件架构模式&#xff0c;尤其在Android应用开发中被广泛使用。它将应用程序分为三层&#xff1a;Model、View 和 Presenter&#xff0c;以实现职责分离&#xff0c;提高代码的可维护性和可测试性。 …

基于自适应VSG控制的光伏混合储能构网型逆变系统MATLAB仿真模型

模型简介 此模型源侧部分采用光伏发电系统与混合储能系统&#xff08;蓄电池超级电容&#xff09;&#xff0c;并网逆变器采用虚拟同步发电机&#xff08;VSG&#xff09;控制&#xff0c;为系统提供惯量阻尼支撑。同时对VSG控制部分进行了改进&#xff0c;采用构造函数法对虚…

论文阅读(二十九):Multi-scale Interactive Network for Salient Object Detection

文章目录 Abstract1.Introduction2.Scale VariationProposed Method3.1Network Overview3.2Aggregate Interaction Module3.3 Self-Interaction Module3.4Consistency-Enhanced Loss 4.Experiments4.1Implementation Details4.2 Comparison with State-of-the-arts4.3Ablation …

【力扣】[Java版] 刷题笔记-21. 合并两个有序链表

题目&#xff1a; 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题思路 从题目和示例可以看出&#xff0c;应该是要循环遍历链表进行比较&#xff0c;然后组成新的链表。 第一种&#xff1a;递归…

存储过程(SQL)

1.存储过程 存储过程&#xff08;Stored Procedure&#xff09;是一组为了完成特定功能的SQL语句集&#xff0c;经编译后存储在数据库中&#xff0c;用户通过指定存储过程的名字并给定参数&#xff08;如果该存储过程带有参数&#xff09;来调用执行它。 2.MySQL存储过程创建…