2021/4/28爬虫第七次课(正则表达式下、csv模块)

文章目录

  • 一、re常用的方法
  • 二、flags匹配模式
  • 三、re库的分组功能
  • 四、csv模块
    • 4.1概念
    • 4.2使用
  • 五、爬虫案例

一、re常用的方法

2021/4/28爬虫第七次课(正则表达式下、csv模块)_第1张图片

  • compile(pattern, flags=0)
    这个⽅法是re模块的工厂法,⽤于将字符串形式的正则表达式编译为Pattern模式对象,可以实现更加效率的匹配。第二个参数flag是匹配模式 使用compile()完成一次转换后,再次使用该匹配模式的时候就不能进行转换了。经过compile()转换的正则表达式对象也能使用普通的re⽅法
  • search(pattern, string, flags=0)
    在文本内查找,返回第一个匹配到的字符串。它的返回值类型和使用方法与match()是一样的,唯一的区别就是查找的位置不用固定在文本的开头
  • findall(pattern, string, flags=0)
    作为re模块的三大搜索函数之一,findall()和match()、search()的不同之处在于,前两者都是单值匹配,找到一个就忽略后面,直接返回不再查找了。而findall是全文查找,它的返回值是一个匹配到的字符串的列表。这个列表没有group()方法,没有start、end、span,更不是一个匹配对象,仅仅是个列表!如果一项都没有匹配到那么返回一个空列表
  • split(pattern, string, maxsplit=0, flags=0)
    re模块的split()方法和字符串的split()方法很相似,都是利用特定的字符去分割字符串。但是re模块的split()可以使用正则表达式,因此更灵活,更强大
    split有个参数maxsplit,用于指定分割的次数
  • sub(pattern, repl, string, count=0, flags=0)
    sub()方法类似字符串的replace()方法,用指定的内容替换匹配到的字符,可以指定替换次数

总结:

  1. compile实现正则的复用
  2. match、search返回对象
  3. findall、split返回列表
  4. sub返回字符串
import re
import csv
# compile方法
str1 = '1+2*3/4-8'
pat = re.compile(r'[\+\-\*\/]')
res = pat.split(str1)
print(res)
# ['1', '2', '3', '4', '8']

二、flags匹配模式

2021/4/28爬虫第七次课(正则表达式下、csv模块)_第2张图片
2021/4/28爬虫第七次课(正则表达式下、csv模块)_第3张图片

三、re库的分组功能

Python的re模块有一个分组功能。所谓的分组就是去已经匹配到的内容再筛选出需要的内容,相当于二次过滤。实现分组靠圆括号(),而获取分组的内容靠的是group()、groups(),其实前面我们已经展示过。re模块里的积个重要方法在分组上,有不同的表现形式,需要区别对待

四、csv模块

4.1概念

CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本格式,用以存储表格数据,包括数字或者字符。很多程序在处理数据时都会碰到csv这种格式的文件。python自带了csv模块,专门用于处理csv文件的读取

4.2使用

  • 写入csv文件
    1 通过创建writer对象,主要用到2个方法。一个是writerow,写入一行。另一个是writerows写入多行
    2 使用DictWriter 可以使用字典的方式把数据写入进去
  • 读取文件
    1 通过reader()读取到的每一条数据是一个列表。可以通过下标的方式获取具体某一个值
    2 通过DictReader()读取到的数据是一个字典。可以通过Key值(列名)的方式获取数据
import csv
# 1 通过writer对象 writerow  writerows
# headers = ('name','age','height') # 只要能够遍历就可以 迭代器 可迭代对象
# persons = [
#     ('aa',18,180),
#     ('bb',28,185),
#     ('cc',38,170)
# ]
# with open('persons.csv','w',encoding='utf-8') as file_obj:
#     writer = csv.writer(file_obj)
#     writer.writerow(headers)
#     for data in persons:
#         writer.writerow(data)

# ------------------------------------------------------
# headers = ('name','age','height') # 只要能够遍历就可以 迭代器 可迭代对象
# persons = [
#     ('aa',58,180),
#     ('bb',28,185),
#     ('cc',38,170)
# ]
# with open('persons.csv','w',encoding='utf-8',newline='') as file_obj:
#     writer = csv.writer(file_obj)
#     writer.writerow(headers)
#     writer.writerows(persons)
'''
如果你通过excel打开csv文件是乱码
代码没问题 excel表格
'''


# 2 通过DictWriter对象
# headers = ('name','age','height')
# persons = [
#     {'name':'aa','age':18,'height':175},
#     {'name':'bb', 'age': 18,'height':175},
#     {'name':'cc', 'age': 18,'height':175},
# ]
# with open('persons.csv','w',encoding='utf-8',newline='') as file_obj:
#     Dwriter = csv.DictWriter(file_obj,headers)
#     Dwriter.writeheader()
#     Dwriter.writerows(persons)

# with open('persons.csv','r',encoding='utf-8',newline='') as file_obj:
#     reader = csv.reader(file_obj)#reader是对象
#     for x in reader:
#         print(x[2])


# with open('persons.csv', 'r', encoding='utf-8', newline='') as file_obj:
#     Dreader = csv.DictReader(file_obj)
#     for x in Dreader:
#         print(x['name'])

五、爬虫案例

需求:爬取7天的 天气情况 日期 天气状况温度 风力–> 保存到CSV

  1. 分析需求 要干什么事情 通过什么技术来解决
    爬取7天的 天气情况 日期 天气状况温度 风力–> 保存到CSV
  2. 分析页面
    2.1 先明确目标url
    通过分析我们发现今天要爬取的数据都在 ul class=“t clearfix” 这个标签当中,然后我们就去网页的源代码中确定了
    2.2
  3. 先获取网页的源代码 整个html文件
  4. 从网页的源代码当中去匹配ul标签的数据
  5. 从ul标签里面去匹配li标签的数据
  6. 去解析li标签里面的数据
  7. 保存数据
  8. 实现过程
import requests
import re
import csv

headers = {
     
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36'
}

class WeatherSpider:

    # 获取网页源代码
    # 类对象 实例对象 实例方法 类方法
    def getSource(self):
        # 目标url
        url = 'http://www.weather.com.cn/weather/101250101.shtml'
        resp = requests.get(url,headers=headers)
        # print(resp.content.decode('utf-8'))
        return resp.content.decode('utf-8')

    # 解析数据 保存数据
    def parseSource(self):
        content = self.getSource()
        # 匹配ul 正则表达式比较灵活 .*?ul标签前面的数据
        # 匹配并获取的 (
    .*?
) .*?ul标签后面的数据
result = re.match(r'.*?(
    .*?
).*?'
,content,re.S) # print(result.group(1)) # 匹配li ul = result.group(1) lis = re.findall(r'.*?',ul,re.S) lst_all = [] # 保存所有的天气数据 pattern = re.compile(r'.*?

(.*?)

.*?(.*?)

.*?(.*?).*?(.*?).*?'
,re.S) for li in lis: # lst_one = [] # 保存一天的天气数据 r = pattern.match(li) # print(r.group(1),end='') # print(r.group(2),end='') # print(r.group(3),end='') # print(r.group(4),end='') # print() lst_one = [r.group(1),r.group(2),r.group(3),r.group(4)] lst_all.append(lst_one) return lst_all # 保存数据 def saveData(self): content = self.parseSource() with open('weather7day.csv','w',encoding='utf-8',newline='') as file_obj: writer = csv.writer(file_obj) writer.writerow(['日期','天气','温度','风力']) writer.writerows(content) def main(): WeatherSpider().saveData() if __name__ == '__main__': main()

你可能感兴趣的:(爬虫,正则表达式,re库,正则表达式,csv)