数据解析的目的是不拿到页面的全部内容,只拿到部分我们想要的内容内容。
Re解析就是正则解析,效率高准确性高。学习本节内容前需要学会基础的正则表达式。
1、常用元字符
. 匹配除换行符以外的字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开始
$ 匹配字符串的结尾
\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中字符的所有字符
2、量词:控制前面的元字符出现的次数
* 重复0次或更多次
+ 重复一次或更多次
? 重复0次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
3、贪婪匹配和非贪婪匹配(重要)
.* 贪婪匹配
.*? 惰性匹配
re模块中只需要记住以下几种功能就够用了
匹配字符串中所有的符合正则的内容,返回list
import re list = re.findall(r"\d+","我的电话号是:10086,小红的电话是100000") print(list) #运行结果:['10086', '100000']
和findall差不多,只不过这时返回的是迭代器
因为findall返回列表,当页面上数据较大时,list就会非常大,效率不高。
从迭代器中拿到内容需要.group()
import re it = re.finditer(r"\d+","我的电话号是:10086,小红的电话是100000") print(it) #返回结果: for i in it: print(i.group()) #返回结果 # 10086 # 100000
进行匹配,但是如果匹配到了第一个结果,就会返回这个结果。如果匹配不上search返回的是None。
如果拿到了返回的依然是迭代器,使用.group()取到匹配的内容
import re s = re.search(r"\d+","我的电话号是:10086,小红的电话是100000") print(s.group()) #返回结果 10086
只能从字符串的开头进行匹配。相当于在正则表达式前面加了一个^
import re s1 = re.match(r"\d+","我的电话号是:10086,小红的电话是100000") print(s1.group()) #报错,未找到 s2 = re.match(r"\d+","10086,小红的电话是100000") print(s2.group()) #返回10086
当后面正则较为复杂的时候,就可以使用预加载,先写规则。
import re obj = re.compile(r"\d+") ret = obj.finditer("我的电话号是:10086,小红的电话是100000") for it in ret: print(it.group())
6、单独提取正则中的内容
re.S的作用是让.能匹配换行符
obj = re.compile(r"(?P.*?) ", re.S)#re.S的作用是让.能匹配换行符 ret = obj.finditer(s) for it in ret: print(it.group("hello")) # 小米 # 华为 # 三星 # 苹果
拿到排行榜的电影名称,年份,评价,打分,并使用csvwriter写入到csv文件中
(1)拿到页面源代码 requests
(2)通过re来提取到想要的有效信息 re
import re import requests import csv url = "http://movie.douban.com/top250" headers ={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0" } resp = requests.get(url,headers=headers) page_content = resp.text #解析数据 obj = re.compile(r'.*?(?P.*?).*?' r'.*?
(?P
下一篇:建行惠懂你的交易密码是几位
相关内容