当前位置: 首页 > news >正文

【自用】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爬虫学习&#xff08;二&#xff09; 网页解析的三种方式1.正则表达式-re解析常用表达&#xff1a;re常用函数&#xff1a;在html中的运用&#xff1a; 2.BeautifulSoup解析常用语法&#xff1a;用法举例&#xff1a; 3.xpath解析示例代码1&#xff1a;示例代码2&#xf…...

从零到一:家政保洁小程序搭建全攻略与功能作用深度解析

目录 一、家政保洁小程序主要功能 二、家政保洁小程序搭建教程 &#xff08;一&#xff09;前期准备 &#xff08;二&#xff09;注册与选择工具 &#xff08;三&#xff09;设计与开发 &#xff08;四&#xff09;测试与优化 &#xff08;五&#xff09;发布与推广 一、…...

单元测试:为工程质量保驾护航

单元测试 单元测试是软件开发过程中确保代码质量和正确性的关键手段。它指的是对软件中的最小可测试单元&#xff08;通常是函数或方法&#xff09;进行验证&#xff0c;确保其行为符合预期。 基本概念 单元测试&#xff1a;验证软件中最小单元&#xff08;通常是函数或方法…...

江协科技STM32学习笔记

第01章 STM32简介及开发环境搭建 1.1 STM32简介 1.1.1 STM32F103C8T6 系列&#xff1a;主流系列STM32F1 内核&#xff1a;ARM Cortex-M3 主频&#xff1a;72MHz RAM&#xff1a;20K&#xff08;SRAM&#xff09; ROM&#xff1a;64K&#xff08;Flash&#xff09; 供电…...

RabbitMQ再回首--往事如梦

这文章你就读吧&#xff0c;越读越&#x1f978;&#xff0c;一读一个不吱声 可靠的&#x1f430;警官&#xff1a;rabbitMQ&#xff0c;功能全面&#xff0c;不丢数据&#xff0c;体量小&#xff0c;容易堆积 声明exchange channel . exchangeDeclare ( String exchange , …...

头狼择校小程序

综述介绍 头狼择校&#xff0c;是头狼择™高校的简称&#xff0c;我们专注高校、大学的择校。倡导先嗅就业再择校&#xff0c;是预约工具和对话平台。帮您嗅招办、嗅教授、嗅学姐&#xff0c;预约择校有关的老师、顾问&#xff0c;助力考大学和考研的“双考”学生及家长了解就…...

【Electron】npm安装Electron项目失败报错问题和解决办法

前言 闲来无事&#xff0c;便想着研究一下Electron&#xff0c;没想到安装直接就卡住了 问题 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)工程入门

文章目录 人工智能提示&#xff08;prompt&#xff09;工程入门一、目的二、使用1、角色2、提示3、上下文4、例子5、输入6、输出 三、使用示例 人工智能提示&#xff08;prompt&#xff09;工程入门 一、目的 对于当前的发达的人工智能&#xff0c;我们可以广泛使用&#xff0…...

【机器学习的基本思想】模型优化与评估

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…...

公司电脑监控软件推荐(一口气了解8款!)一起领略电脑监控界的刀光剑影!

企业的内部管理的需求日益复杂&#xff0c;电脑监控软件作为提升工作效率、保障数据安全的重要工具&#xff0c;其重要性不言而喻。今天&#xff0c;我们将带您一口气了解8款顶尖的公司电脑监控软件&#xff0c;包括国内知名的“安企神”以及多款来自海外的优秀产品&#xff0c…...

设备图纸资料管理系统:数字化转型下的高效协同与安全管理新篇章

在当今高度信息化的时代&#xff0c;设备图纸资料管理系统作为企业资产与知识管理的重要一环&#xff0c;正日益凸显其不可或缺的价值。这一系统集成了先进的数字化技术与管理理念&#xff0c;旨在实现设备图纸资料的高效存储、快速检索、安全共享及版本控制&#xff0c;为企业…...

ArcGIS基础:标注转注记及简单处理

注记是一个静态的标签图层&#xff0c;能够独立的保存为文件&#xff0c;并且具有计算功能&#xff1b; 标注是一个动态的标签图形&#xff0c;无法以文件的形式进行存储和计算&#xff1b; 2者各有优势和劣势&#xff0c;根据具体需求进行选择 需要注意的是注记要存储在GDB…...

jQuery实现图片轮播效果

实现图片轮播效果&#xff0c;打开页面&#xff0c;每隔3秒切换至下一张图片&#xff1b;光标移入数字时&#xff0c;播放相应图片。 思路&#xff1a; &#xff08;1&#xff09;获取需要轮播的图片和展示的div。 &#xff08;2&#xff09;使用animate设置left值&#xff…...

关于天地图新手使用

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对比分析

在嵌入式系统领域&#xff0c;STM32、Arduino 和 ESP32 是三种广泛使用的微控制器平台。它们各自具有独特的优势&#xff0c;适用于不同类型的项目。本文将详细比较这些平台&#xff0c;帮助您了解它们之间的差异、优势以及可能的应用场景。 一、架构与处理能力 STM32&#xf…...

125. 验证回文串【 力扣(LeetCode) 】

一、题目描述 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b…...

3年经验,面试测试岗20k都拿不到了吗?

我的情况 大概介绍一下个人情况&#xff0c;女&#xff0c;本科&#xff0c;三年多测试工作经验&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xff0c;会性能&#xff0c;然而到今天都没有收到一份offer&#xff01;从年后就开始准备简历&#xff0c;年…...

【ML】强化学习(Reinforcement Learning)及其拆解

【ML】强化学习&#xff08;Reinforcement Learning&#xff09; 1. RL Outline 强化学习&#xff08;Reinforcement Learning&#xff09;概述1.1 RL的基本框架 2. RL 引入&#xff1a;从这个小游戏开始3. Policy Gradient 方法4. Actor-Critic 方法5. [奖励塑形&#xff08;R…...

在宝塔面板下安装WordPress

宝塔面板是服务器管理好助手&#xff0c;尤其在Linux系统下&#xff0c;提高了管理的可视化&#xff0c;降低了Linux服务器的使用门槛。 WordPress是个非常好的博客系统&#xff0c;由于支持海量主题模板、各种类型的插件&#xff0c;因此已经成为建设各类网站的首选框架。 今…...

纷享销客CRM AI产品架构概览、产品特色

一、纷享销客CRM AI产品架构概览 纷享AI平台架构分为三个主要层次&#xff1a;AI基础设施层、AI平台层和AI应用层。每个层次都由一系列功能模块组成&#xff0c;旨在为客户提供强大的技术支持和灵活的解决方案。 1.Al基础设施层 AI基础设施层是整个AI平台的底层支撑&#xff…...

【文件IO】文件系统操作

文章目录 基本操作概述1. 文件属性2. 文件构造方法3. 文件方法1. 文件创建2. 文件删除3. 查看目录下所有的文件名4. 遍历目录5. 创建目录5. 目录重命名 基本操作概述 创建文件删除文件创建目录重命名文件判定文件存在… Java 中&#xff0c;提供了一个 File 类&#xff0c;进…...

Spring Cloud Alibaba 集成分布式定时任务调度功能

作者&#xff1a;千习 背景简介 定时任务是指在约定的时间&#xff0c;或者按照固定频率周期性执行的任务。在企业应用中&#xff0c;非用户行为发起的后台业务&#xff0c;一般都是通过定时任务来实现&#xff0c;常见场景如下&#xff1a; 异步数据处理&#xff1a;比如先…...

中职云计算实训室

一、实训室建设背景 随着信息技术的飞速发展&#xff0c;云计算已成为推动数字化转型、促进经济社会发展的重要力量。《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》明确提出&#xff0c;要加快数字化发展&#xff0c;建设数字中国。云计算作为数…...

【python制作一个小程序作为七夕礼物】

制作一个七夕节礼物的小程序&#xff0c;我们可以考虑一个简单的互动程序&#xff0c;比如一个“七夕情侣姓名配对指数计算器”。这个程序将接收两个名字作为输入&#xff0c;然后输出一个随机的“配对指数”和一些浪漫的话语。以下是一个使用Python实现的简单示例&#xff1a;…...

一篇文章教会你如何使用Haproxy,内含大量实战案例

1. Haproxy 介绍 HAProxy是法国开发者 威利塔罗&#xff08;Willy Tarreau&#xff09; 使用C语言编写的自由及开放源代码软件&#xff0c;是一款具备高并发&#xff08;万级以上&#xff09;、高性能的TCP和HTTP应用程序代理. HAProxy运行在当前的硬件上&#xff0c;可以支持…...

PythonStudio 控件使用常用方式(二十二)TFlowPanel

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;官网地址是&#xff1a;https://glsite.com/ &#xff0c;在官网可以下载最新版的PythonStudio&#xff0c;同时&#xff0c;在使用PythonStudio时&#xff0c;它也能及时为用户升到最新版本。它使用的是Delphi的控件&…...

培训第二十七天(lvs_nat模式与lvs_dr模式配置)

上午 核心&#xff1a;内核中的ipvs&#xff0c;ipvsadm1、安装ipvsadm[rootnat ~]# yum -y install ipvsadm2、配置规则查看所有的规则&#xff0c;如果已经配置好规则&#xff0c;重启之后也就没有了[rootnat ~]# ipvsadm -L -n 1、配置vip网卡 &#xff08;1&#xff09;在…...

JAVA中DateFormat详解

在Java中&#xff0c;DateFormat 是一个抽象类&#xff0c;它用于格式化和解析日期。DateFormat 允许进行日期-文本之间的转换&#xff0c;以及日期-时间之间的解析和格式化。Java 提供了多个 DateFormat 的具体子类&#xff0c;其中最常用的是 SimpleDateFormat&#xff0c;它…...

uniapp——列表选择样式

案例 代码 <view class"list"><block v-for"(item,index) in 8" :key"index"><view class"item" click"choosePackage(item)" :class"{active:item current}"><view class"i_money&q…...

解决客户访问超时1s问题

访问公网地址返回状态码499-CSDN博客 需求描述 客户访问公司公网服务,期望在1s内完成。他们在客户端设置了超时1s的配置,如果超过1s公司服务就会报错499,这是正常的请求返回。 这里是业务简易的连路图: 分析问题 目前这个服务通过公网的alb负载均衡到ecs,通过ecs再转发…...