【自用】Python爬虫学习(二):网页解析的三种方式(re、bs4、xpath)
Python爬虫学习(二)
- 网页解析的三种方式
- 1.正则表达式-re解析
- 常用表达:
- re常用函数:
- 在html中的运用:
- 2.BeautifulSoup解析
- 常用语法:
- 用法举例:
- 3.xpath解析
- 示例代码1:
- 示例代码2:
网页解析的三种方式
1.正则表达式-re解析
常用表达:
正则表达式常用字符:
===============常用元字符:===============
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符^ 匹配字符串的开始
$ 匹配字符串的结尾\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符a|b 匹配字符a或字符b
() 匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中字符的所有字符===============量词:控制前面的元字符出现的次数===============
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次===============贪婪匹配和情性匹配===============
.* 贪婪匹配
.*? 情性匹配
re常用函数:
import re# re.findall(正则表达式,字符串),:匹配字符串中所有的符合正则的内容,返回的结果是一个列表
print("===============findall():===============")
lis = re.findall(r'\d+', '我的电话号码是10086,小明的电话是10010')
print(lis)
# ['10086', '10010']# finditer():匹配字符串中所有的内容【返回的是选代器】,从迭代器中拿到内容需要:group(),效率更高
print("===============finditer():===============")
it = re.finditer(r'\d+', "我的电话号是:10086,小明的电话是:10010")
for i in it:print(i.group())
# 10086
# 10010# search()找到一个结果就返回,返回的是match对象,拿数据需要.group()
print("===============search():===============")
s = re.search(r'\d+', "我的电话号是:10086,小明的电话是:10010")
print(s.group())
# 10086# match是从头开始匹配
print("===============match():===============")
m = re.match(r'\d+', "10086,小明的电话是:10010")
print(m.group())
# 10086# 预加载正则表达式
print("===============预加载正则表达式:===============")
obj = re.compile(r"\d+")
ret = obj.finditer("我的电话号是:10085,小明的电话是:10000")
for it in ret:print(it.group())
# 10085
# 10000
在html中的运用:
import retext = """
<div class='jay'><span id='1′>郭某某</span></div>
<div class='jj'><span id='2′>宋某某</span></div>
<div class='jolin'><span id='3′>李某某</span></div>
<div class='sylar'><span id='4′>范某某</span></div>
<div class='tory'><span id='5′>刘某某</span></div>"""
# (?P<分组名字>正则)可以单独从正则匹配的内容中进一步提取内容,re.S的作用是让.能匹配换行符
obj = re.compile(r"<div class='.*?><span id='(?P<num>\d+)′>(?P<name>.*?)</span></div>", re.S)result = obj.finditer(text)
for it in result:print(it.group())# <div class ='jay' > < span id='1′>郭某某</span></div>print(it.group('name'))# 郭某某print(it.group('num'))# 1
2.BeautifulSoup解析
常用语法:
"""
-如何实例化BeautifulSoup对象:-from bs4 import BeautifulSoup-对象的实例化:-1.将本地的htmL文档中的数据加载到该对象中fp=open('./test.html','r',encoding='utf-8')soup=BeautifulSoup(fp,'lxml')2.将互联所网上获取的页面源码加载到该对象中page_text=response.textsoup=BeautifulSoup(page_text,'lxml')-提供的用于数据解析的方法和属性:-soup.tagName:返回的是文档中第一次出现的tagName对应的标签-soup.find():-find('tagName'):等同于soup.div-属性定位-soup.find('div',class_/id/attr='song')-soup.find_all('tagName'):返回符合要求的所有标签(列表)-select:-select('某种选择器(id,class,标签……选择器)'),返回的是一个列表。-层级选择器:-soup.select('.tang>ul>li>a'):>表示的是一个层级-soup.select('.tang>ul a'):空格表示的多个层级-获取标签之间的文本数据:-soup.a.text/string/get_text()-text/get_text():可以获取某一个标签中所有的文本内容-string:只可以获取该标签下面直系的文本内容·-获取标签中属性值:-soup.a['href']"""
用法举例:
import requests
from bs4 import BeautifulSoupurl = ''
hearders = {'User-Agent': ''
}
resp = requests.get(url=url, headers=hearders)
# 对象的实例化
soup = BeautifulSoup(resp.text, 'lxml')
# 标签定位
# 返回的是文档中第一次出现的tagName对应的标签
div_first1 = soup.find('div')
div_first2 = soup.div
# div_first1与div_first2效果一样# 属性定位
# 写法1,添加下划线'class_'规避关键字class
soup.find('div', class_='song')
# 写法2,写成字典形式
soup.find('div', attrs={"class": "song"})# 返回符合要求的所有标签(列表)
soup.find_all('tagName')# 层级选择器,返回的是一个列表
# >表示的是一个层级
soup.select('.tang > ul > li > a')
# 空格表示的多个层级
soup.select('.tang > ul a')# 获取标签之间的文本数据
"""
……
<div><p>段落</p>内容测试<a href='www.baidu.com'>百度</a><a href='www.bing.com'>必应</a>
</div>
……
"""
# 可以获取某一个标签中所有的文本内容
div_text1 = soup.div.text # 结果包含:段落 内容测试 百度 必应
div_text2 = soup.div.get_text() # 结果包含:段落 内容测试 百度 必应# 只可以获取该标签下面直系的文本内容
# <a href='wwww.baidu.com'>百度</a>
a_text3 = soup.a.string # 百度# 获取标签中属性值:
# 获取<a href='wwww.baidu.com'>百度</a>中的href链接文本
# 方法1
web_links = soup.a['href'] # wwww.baidu.com
# 方法2
web_page = BeautifulSoup(resp.text, "html.parser")
div_list = web_page.find('div', class_='big-pic')
image_src = div_list.find('img').get('src') # 用get拿到标签的对应属性
3.xpath解析
示例代码1:
from lxml import etreexml = """
<book><id>1</id><name>野花遍地香</name><price>1.23</price><nick>臭豆腐</nick><author><nick id="10086">周大强</nick><nick id="10010">周芷若</nick><nick class="joy">周杰伦</nick><nick class="jolin">蔡依林</nick><div><nick>惹了1</nick></div><span><nick>惹了2</nick><div><nick>惹了3</nick></div></span></author><partner><nick id="ppc">胖胖陈</nick><nick id="ppbc">胖胖不陈</nick></partner></book>"""tree = etree.XML(xml)
# result = tree.xpath("/book")
result = tree.xpath("/book/name/text()") # ['野花遍地香']
# -/text()取的是标签中直系的文本内容;//text()标签中非直系的文本内容(所有的文本内容)result = tree.xpath("/book/author/nick/text()")
# ['周大强', '周芷若', '周杰伦', '蔡依林']
result = tree.xpath("/book/author/div/nick/text()")
# ['惹了1']
result = tree.xpath("/book/author//nick/text()")
# ['周大强', '周芷若', '周杰伦', '蔡依林', '惹了1', '惹了2', '惹了3']
result = tree.xpath("/book/author/*/nick/text()")
# *任意的节点,通配符,['惹了1', '惹了2']result = tree.xpath("/book//nick/text()")
# ['臭豆腐', '周大强', '周芷若', '周杰伦', '蔡依林', '惹了1', '惹了2', '惹了3', '胖胖陈', '胖胖不陈']print(result)
示例代码2:
"Test.html"文件内容如下所示:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" /><title>Title</title>
</head>
<body>
<ul><li><a href="http://www.baidu.com">百度</a></li><li><a href="http://www.google.com">谷歌</a></li><li><a href="http://www.sogou.com">搜狗</a></li>
</ul>
<ol><li><a href="feiji">飞机</a></li><li><a href="dapao">大炮</a></li><li><a href="huoche">火车</a></li>
</ol><div class="job">李嘉诚</div>
<div class="common">胡辣汤</div></body>
</html>
from lxml import etree# 读取Test.html文件
tree = etree.parse("Test.html")
result = tree.xpath('/html')result1 = tree.xpath("/html/body/ul/li/a/text()")
# ['百度', '谷歌', '搜狗']
print(result1)# 注意这里的xpath的索引是从1开始的,li[1]代表取第一个,[]中数字代表索引
result2 = tree.xpath("/html/body/ul/li[1]/a/text()")
# ['百度']
print(result2)result3 = tree.xpath("/html/body/ol/li/a[@href='dapao']/text()")
# ['大炮']
print(result3)ol_li_list = tree.xpath("/html/body/ol/li")for li in ol_li_list:# 从每一个1i中提取到文字信息result = li.xpath("./a/text()") # 在li中继续去寻找,相对查找,注意用./print(result)# 拿到属性值:@属性值result2 = li.xpath("./a/@href") # 在li中继续去寻找,获取到属性href的值print(result2)print(tree.xpath("/html/body/ul/li/a/@href"))
# ['http://www.baidu.com', 'http://www.google.com', 'http://www.sogou.com']print(tree.xpath("/html/body/div/text()"))
# ['李嘉诚', '胡辣汤']
相关文章:
【自用】Python爬虫学习(二):网页解析的三种方式(re、bs4、xpath)
Python爬虫学习(二) 网页解析的三种方式1.正则表达式-re解析常用表达:re常用函数:在html中的运用: 2.BeautifulSoup解析常用语法:用法举例: 3.xpath解析示例代码1:示例代码2…...
从零到一:家政保洁小程序搭建全攻略与功能作用深度解析
目录 一、家政保洁小程序主要功能 二、家政保洁小程序搭建教程 (一)前期准备 (二)注册与选择工具 (三)设计与开发 (四)测试与优化 (五)发布与推广 一、…...
单元测试:为工程质量保驾护航
单元测试 单元测试是软件开发过程中确保代码质量和正确性的关键手段。它指的是对软件中的最小可测试单元(通常是函数或方法)进行验证,确保其行为符合预期。 基本概念 单元测试:验证软件中最小单元(通常是函数或方法…...
江协科技STM32学习笔记
第01章 STM32简介及开发环境搭建 1.1 STM32简介 1.1.1 STM32F103C8T6 系列:主流系列STM32F1 内核:ARM Cortex-M3 主频:72MHz RAM:20K(SRAM) ROM:64K(Flash) 供电…...
RabbitMQ再回首--往事如梦
这文章你就读吧,越读越🥸,一读一个不吱声 可靠的🐰警官:rabbitMQ,功能全面,不丢数据,体量小,容易堆积 声明exchange channel . exchangeDeclare ( String exchange , …...
头狼择校小程序
综述介绍 头狼择校,是头狼择™高校的简称,我们专注高校、大学的择校。倡导先嗅就业再择校,是预约工具和对话平台。帮您嗅招办、嗅教授、嗅学姐,预约择校有关的老师、顾问,助力考大学和考研的“双考”学生及家长了解就…...
【Electron】npm安装Electron项目失败报错问题和解决办法
前言 闲来无事,便想着研究一下Electron,没想到安装直接就卡住了 问题 npm ERR! RequestError: Hostname/IP does not match certificates altnames: Host: npm.taobao.org. is not in the certs altnames: DNS:*.tbcdn.cn, DNS:*.taobao.com, DNS:*.al…...
人工智能提示(prompt)工程入门
文章目录 人工智能提示(prompt)工程入门一、目的二、使用1、角色2、提示3、上下文4、例子5、输入6、输出 三、使用示例 人工智能提示(prompt)工程入门 一、目的 对于当前的发达的人工智能,我们可以广泛使用࿰…...
【机器学习的基本思想】模型优化与评估
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,…...
公司电脑监控软件推荐(一口气了解8款!)一起领略电脑监控界的刀光剑影!
企业的内部管理的需求日益复杂,电脑监控软件作为提升工作效率、保障数据安全的重要工具,其重要性不言而喻。今天,我们将带您一口气了解8款顶尖的公司电脑监控软件,包括国内知名的“安企神”以及多款来自海外的优秀产品,…...
设备图纸资料管理系统:数字化转型下的高效协同与安全管理新篇章
在当今高度信息化的时代,设备图纸资料管理系统作为企业资产与知识管理的重要一环,正日益凸显其不可或缺的价值。这一系统集成了先进的数字化技术与管理理念,旨在实现设备图纸资料的高效存储、快速检索、安全共享及版本控制,为企业…...
ArcGIS基础:标注转注记及简单处理
注记是一个静态的标签图层,能够独立的保存为文件,并且具有计算功能; 标注是一个动态的标签图形,无法以文件的形式进行存储和计算; 2者各有优势和劣势,根据具体需求进行选择 需要注意的是注记要存储在GDB…...
jQuery实现图片轮播效果
实现图片轮播效果,打开页面,每隔3秒切换至下一张图片;光标移入数字时,播放相应图片。 思路: (1)获取需要轮播的图片和展示的div。 (2)使用animate设置left值ÿ…...
关于天地图新手使用
1分钟带你了解学习天地图 适用新手 天地图API (tianditu.gov.cn) 文档api 先去注册key 把脚本放到index.html文件里面 <!-- 天地图的官网申请的tk --> <script src="http://api.tianditu.gov.cn/api?v=4.0&tk=申请的key" type="text/javascr…...
STM32与Arduino和ESP32对比分析
在嵌入式系统领域,STM32、Arduino 和 ESP32 是三种广泛使用的微控制器平台。它们各自具有独特的优势,适用于不同类型的项目。本文将详细比较这些平台,帮助您了解它们之间的差异、优势以及可能的应用场景。 一、架构与处理能力 STM32…...
125. 验证回文串【 力扣(LeetCode) 】
一、题目描述 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s,如果它是 回文串 ,返回 true ;…...
3年经验,面试测试岗20k都拿不到了吗?
我的情况 大概介绍一下个人情况,女,本科,三年多测试工作经验,懂python,会写脚本,会selenium,会性能,然而到今天都没有收到一份offer!从年后就开始准备简历,年…...
【ML】强化学习(Reinforcement Learning)及其拆解
【ML】强化学习(Reinforcement Learning) 1. RL Outline 强化学习(Reinforcement Learning)概述1.1 RL的基本框架 2. RL 引入:从这个小游戏开始3. Policy Gradient 方法4. Actor-Critic 方法5. [奖励塑形(R…...
在宝塔面板下安装WordPress
宝塔面板是服务器管理好助手,尤其在Linux系统下,提高了管理的可视化,降低了Linux服务器的使用门槛。 WordPress是个非常好的博客系统,由于支持海量主题模板、各种类型的插件,因此已经成为建设各类网站的首选框架。 今…...
纷享销客CRM AI产品架构概览、产品特色
一、纷享销客CRM AI产品架构概览 纷享AI平台架构分为三个主要层次:AI基础设施层、AI平台层和AI应用层。每个层次都由一系列功能模块组成,旨在为客户提供强大的技术支持和灵活的解决方案。 1.Al基础设施层 AI基础设施层是整个AI平台的底层支撑ÿ…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
