前言:许多情况下,我们不需要整个网页的内容,只需要部分的数据,所以我们需要将提取到的数据解析。
一、re解析
RegularExpression-----正则表达式,是一种使用表达式的方式对字符串进行匹配的语法规则。优点是速度快、效率高、准确性高,缺点是新手上手难。
1.正则表达式语法
元字符:
?量词:控制前面元字符出现的次数。
?贪婪匹配和惰性匹配:
2.正则表达式在python中的实现
import re
lst = re.findall("\d+", "今天6点,我跑了15000m")
print(lst)#['6', '15000']
- search():会进行匹配,但是如果匹配到了第一个结果,就会返回这个结果,如果匹配不到返回None。
import re
lst = re.search("\d+", "今天6点,我跑了15000m").group()
print(lst)#6
import re
lst = re.match("\d+", "今天6点,我跑了15000m").group()
print(lst)#报错
- finditer():和findall差不多,只不过它返回的是迭代器。
import re
lst = re.finditer("\d+", "今天6点,我跑了15000m")
for i in lst:
print(i.group())
import re
obj = re.compile("\d+")
lst = obj.findall("今天6点,我跑了15000m")
print(lst)#['6', '15000']
- re.S:让元字符"."匹配换行符。
- (?P<组名>):为正则表达式分组,调用grop("组名")函数输出命名为该组名的表达式。
二、上手试试
1.爬取豆瓣排行榜数据?
▼▼▼要解析的数据▼▼▼
import re
import requests
import csv
page = input("请输入页码(0=1,25=2,50=3...):")
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
}
url = f"https://movie.douban.com/top250?start={page}&filter="
# 拿取页面源代码
res = requests.get(url=url,headers=header)
res_text = res.text
#解析数据
obj = re.compile(r'<li>.*?<span class="title">(?P<name>.*?)</span>'
r'.*?<br>(?P<year>.*?) '
r'.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
r'.*?<span>(?P<views>.*?)人评价',re.S)
result = obj.finditer(res_text)
#打开csv文件
f = open("video.csv", mode="w")
#创建写入内容对象
csvwiter = csv.writer(f)
for i in result:
dic = i.groupdict()
dic['year'] = dic['year'].strip()#为year单独设置跳过空格
csvwiter.writerow(dic.values())#写入内容为dic里的数据
#print(i.group("name"))
#print(i.group("year").strip())#跳过空格
#print(i.group("score"))。
#print(i.group("views"))
f.close()
print("done!")
效果:
|