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

简介: 【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()


目录
相关文章
|
机器学习/深度学习 JSON 物联网
ORPO偏好优化:性能和DPO一样好并且更简单的对齐方法
ORPO是另一种新的LLM对齐方法,这种方法甚至不需要SFT模型。通过ORPO,LLM可以同时学习回答指令和满足人类偏好。
1158 0
|
JSON 自然语言处理 Serverless
基于阿里云通义千问开发智能写作助手
现代办公中,撰写邮件、会议记录、报告等任务耗费大量时间。一个智能写作助手能显著提升效率,帮助用户快速生成高质量的文本内容。阿里云通义千问作为阿里巴巴推出的强大大语言模型(LLM),具备出色的自然语言理解与生成能力,非常适合用于开发智能写作工具。本博客将介绍如何基于通义千问构建一个智能写作助手,实现高效的内容生成和编辑功能。
1462 2
|
Cloud Native 关系型数据库 定位技术
深度融合,POLARDB与SuperMap联合构建首个云原生时空平台
超图软件SuperMap GIS与阿里巴巴新一代自研云数据库POLARDB实现 “引擎级”深度对接,构建了自治、弹性、高可用的云原生时空数据管理平台联合解决方案,推出了业界首个“云原生数据库+云原生GIS”的全国产化平台。
2662 0
|
机器学习/深度学习 人工智能 算法
AI量化交易软件开发技术逻辑
AI量化交易融合人工智能与量化分析,通过算法模型深度解析市场数据,自动生成并执行交易策略,显著提升交易效率与决策精准度。其开发涵盖目标分析、数据处理、算法设计、系统构建、测试优化、合规安全及持续迭代等多个关键环节,涉及金融、编程、大数据与AI等多领域技术。掌握这些核心技术,方能打造高效智能的量化交易系统,助力投资者实现更优收益。
|
机器学习/深度学习 PyTorch TensorFlow
【PyTorch】PyTorch深度学习框架实战(一):实现你的第一个DNN网络
【PyTorch】PyTorch深度学习框架实战(一):实现你的第一个DNN网络
813 2
|
人工智能 自然语言处理 API
ModelScope是什么
【9月更文挑战第1天】ModelScope是什么
4944 2
|
Java Maven
如何计算程序运行时间
如何计算程序运行时间
363 0
|
机器学习/深度学习 自然语言处理 知识图谱
预训练模型(Pre-trained Models)
预训练模型是在大量文本数据上训练的模型,能捕捉语言的通用特征,通过微调适用于各种NLP任务。它们具备迁移学习能力,减少训练时间和资源需求,支持多任务学习,但需注意模型偏见和可解释性问题。常见模型有BERT、GPT等,广泛应用于文本分类、情感分析等领域。
1850 2
java实现打印倒直角三角形
java实现打印倒直角三角形