【Python】爬虫-----数据解析之re解析

前言:许多情况下,我们不需要整个网页的内容,只需要部分的数据,所以我们需要将提取到的数据解析。

一、re解析

RegularExpression-----正则表达式,是一种使用表达式的方式对字符串进行匹配的语法规则。优点是速度快、效率高、准确性高,缺点是新手上手难。

1.正则表达式语法

元字符:

 量词:控制前面元字符出现的次数。

 贪婪匹配和惰性匹配:

2.正则表达式在python中的实现

  • findall():查找所有,返回list。
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
  • match():只能从字符串的开头进行匹配。
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())
  • compile():预加载正则表达式。
import re
obj = re.compile("\d+")
lst = obj.findall("今天6点,我跑了15000m")
print(lst)#['6', '15000']
  • re.S:让元字符"."匹配换行符。
  • (?P<组名>):为正则表达式分组,调用group("组名")函数输出命名为该组名的表达式的解析。

二、上手试试

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>.*?)&nbsp'
                 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!")

效果:


import requests
import re
import csv
url = "https://www.dytt89.com/"
rep = requests.get(url,verify=False)#verify=False去掉安全验证
rep.encoding="gb2312"  #指定字符集

obj1 = re.compile(r'2021必看热片.*?<ul>(?P<ul>.*?)</ul>',re.S)#解析dytt的主页面
obj2 = re.compile(r"<a href='(?P<href>.*?)'",re.S)# 解析它的子网址
obj3 = re.compile(r'◎片  名(?P<move_name>.*?)<br />'#获取名字
                  r'.*?<td style="WORD-WRAP: break-word" bgcolor="#fdfddf"><a href="(?P<move_bt>.*?)">',re.S)#获取电影的BT

result = obj1.finditer(rep.text)#主页面
child_href_list = []
f = open("dytt.csv",encoding = 'gb2312',mode="w")
csvwriter = csv.writer(f)

for i in result:
   result2 = obj2.finditer(i.group('ul'))#从主页面解析到的内容里获取子网址
   for j in result2:
      child_href = url + j.group('href').strip("/")#拼接子页面地址
      child_href_list.append(child_href)

#读取子页面里的内容
for child_content in child_href_list:
   child_rep = requests.get(child_content,verify=False)
   child_rep.encoding = "gb2312"
   result3 = obj3.finditer(child_rep.text)
   for l in result3:
      dic = l.groupdict()
      csvwriter.writerow(dic.values())
f.close()
rep.close()
child_rep.close()
print("done!")


Guess you like

Origin blog.csdn.net/qq_26082507/article/details/121303198