【Python】数据解析——Re解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 【Python】数据解析——Re解析

有时候爬取的数据返回的直接是一个混杂着数据和结构的HTML文件,这个时候获取数据需要进行数据解析,python数据解析主要有三种方法:

1. re解析

效率最高,但是有点复杂,对新手不太友好,准确率高

2. bs4解析

最常用和简单,但是效率并不高

3. xpath解析

清晰易懂

1. Re(regular expression) 正则表达式

先看看正则表达的规则:

1-1 元字符

. ===>匹配除换行符外的任意字符

\n ===> 匹配换行符

\w ===> 匹配字母或数字或下划线

\s ===> 匹配任意的空白符

\d ===> 匹配数字

\t ===> 匹配制表符

^ ===> 匹配字符串的开始

$ ===> 匹配字符串的结尾

\W ===> 匹配非字母或数字或下划线

\D ===> 匹配非数字

\S ===> 匹配非空白符

a|b ===> 匹配a或b

()===> 匹配括号内的表达式,也表示一个组

[...] ===> 匹配字符组中的字符

[^...] ===> 匹配除了字符组中字符的所有字符

1-2 量词

* ===> 重复零次或更多次

+ ===> 重复一次或更多次

? ===> 重复零次或一次

{n} ===> 重复n次

{n,} ===> n重复n次或更多次

{n,m} ===> n重复n次到m次

贪婪匹配===> .*

惰性匹配===> .*?

在爬虫里面,惰性匹配用的更多

【Re】Demo - re的方法介绍

import re
# findall 以数组的形式返回所有匹配的结果
result = re.findall(r"\d+","我的电话号码是:10010,我对手的电话是:10086")
print(result)
# finditer 以迭代器的方式返回所有匹配结果,.group()返回匹配到的结果
res = re.finditer(r"\d+","我的电话号码是:10010,我对手的电话是:10086")
print(res)
for i in res:
    print(i)
    print(i.group())
# search() 返回第一个找到的结果并封装在迭代器中
a = re.search(r"\d+","我的电话号码是:10010,我对手的电话是:10086")
print(a)
print(a.group())
# match() 从头匹配结果并返回在迭代器中
b = re.match(r"\d+","我的电话号码是:10010,我对手的电话是:10086")
print(b)
c = re.match(r"\d+","10010,我对手的电话是:10086")
print(c.group())
# 预加载正则规则
obj = re.compile(r"\d+")
resp = obj.findall("我的电话号码是:10010,我对手的电话是:10086")
print(resp)

结果截图:


image.png

re.S——表示可以匹配到换行符

【Re】Demo - re的案例

import re
s = '''
    <div id="1">CCNU</div>
    <div id="2">HUST</div>
    <div id="3">SSE</div>
    <div id="4">CSUT</div>
'''
pattern = re.compile(r'<div id="(?P<id>\d)">(?P<name>.*?)</div>',re.S)
res = pattern.finditer(s)
for i in res:
    print(i.group("id"))
    print(i.group("name"))

image.png

获取豆瓣top250的电影数据并写进csv文件中

import requests
import re
import csv
url = "https://movie.douban.com/top250"
headers = {
    "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
}
res = requests.get(url,headers=headers)
if res.status_code == 200:
    result = res.text
pattern = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<title>.*?)</span>'
                     r'.*?<p class="">.*?<br>(?P<year>.*?)&nbsp;'
                     r'.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
                     r'.*?<span property="v:best" content="10.0"></span>.*?<span>(?P<ratingNum>.*?)人评价</span>',re.S)
a = pattern.finditer(result)
f = open("doubantop250.csv",mode="w")
csvwriter = csv.writer(f)
for i in a:
    # print(i.group("title"))
    # print(i.group("year").strip())
    # print(i.group("score"))
    # print(i.group("ratingNum"))
    dic = i.groupdict()
    dic['year'] = dic["year"].strip()
    csvwriter.writerow(dic.values())
f.close()
res.close()


目录
相关文章
|
5天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
18 5
|
9天前
|
算法 Python
Python 大神修炼手册:图的深度优先&广度优先遍历,深入骨髓的解析
在 Python 编程中,掌握图的深度优先遍历(DFS)和广度优先遍历(BFS)是进阶的关键。这两种算法不仅理论重要,还能解决实际问题。本文介绍了图的基本概念、邻接表表示方法,并给出了 DFS 和 BFS 的 Python 实现代码示例,帮助读者深入理解并应用这些算法。
21 2
|
9天前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
18 1
|
10天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
10天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
11天前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
32 2
|
17天前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
99 1
|
18天前
|
测试技术 开发者 Python
深入浅出:Python中的装饰器解析与应用###
【10月更文挑战第22天】 本文将带你走进Python装饰器的世界,揭示其背后的魔法。我们将一起探索装饰器的定义、工作原理、常见用法以及如何自定义装饰器,让你的代码更加简洁高效。无论你是Python新手还是有一定经验的开发者,相信这篇文章都能为你带来新的启发和收获。 ###
12 1
|
18天前
|
设计模式 测试技术 开发者
Python中的装饰器深度解析
【10月更文挑战第24天】在Python的世界中,装饰器是那些能够为函数或类“添彩”的魔法工具。本文将带你深入理解装饰器的概念、工作原理以及如何自定义装饰器,让你的代码更加优雅和高效。
|
9天前
|
索引 Python
SciPy 空间数据1
SciPy 通过 `scipy.spatial` 模块处理空间数据,如判断点是否在边界内、计算最近点等。三角测量是通过测量角度来确定目标距离的方法。多边形的三角测量可将其分解为多个三角形,用于计算面积。Delaunay 三角剖分是一种常用方法,可以对一系列点进行三角剖分。示例代码展示了如何使用 `Delaunay()` 函数创建三角形并绘制。
18 0