1.介绍
在爬虫刚开始的过程中,数据的获取很重要,而我们经常获取的数据都是包含html标签的超文本内容。要从超文本内容里面提取我们需要的数据,这个时候我们就会用到正则表达式,能快速的帮我们提取到我们需要的内容。
2.规则
| 符号 | 含义 |
|---|---|
| . | 匹配除换行符以外的任意字符 |
| 以此开头。例如^a,标识以a开头 | |
| $ | 以这个字符结尾,和^同样的概念 |
| * | 0~n次重复前面的字符串 |
| + | 1~n次重复前面的字符串 |
| ? | 0~1次重复 |
| {m} | m次重复 |
| \ | 转义字符 |
| [] | 表示一个集合,里面可以嵌套以上的规则 |
| | | 表示集合或,例如a|b |
| .*? | 贪婪的,最少的任意字符(这个在获取数据的时候会经常用到) |
| (?P…) | 分组所匹配到了子字符串可通过符号分组名称 name 来访问,(这个在获取数据的时候会经常用到) |
以上列举的是最基本的一些用法,具体的可以查看python文档,里面还有很复杂的用法,这里附上re地址# re --- 正则表达式操作
3. re函数简单介绍
| 函数 | 作用 |
|---|---|
| findall | 寻找所有匹配的字符,返回字符列表 |
| finditer | 寻找所有匹配的字符,返回迭代器列表 |
| search | 寻找第一个符号的字符串迭代器 |
| compile | 预编译匹配公式,可以多次使用,效率更高 |
import re
findStr = '<a class="nbg" href="https://movie.douban.com/subject/36149380/" title="长腿", Tel="123">'
result_list = re.findall(r'\d+', findStr) # 找出所有的数字串
for i in result_list:
print(i)
print('-------------------------')
result = re.search(r'\d+', findStr) # 找出第一个符号的数字串
print(result.group())
print('-------------------------')
it = re.finditer(r'\d+', findStr) # 找出所有的数字串 返回的是迭代器
for i in it:
print(i.group())
print('-------------------------')
pattern = re.compile(r'\d+') #预编译匹配公式,可以多次使用,效率更高
result_list1 = pattern.findall(findStr)
for i in result_list1:
print(i)
print('-------------------------')
findStr2 = 'https://movie.douban.com/subject/36149380/'
result_list2 = pattern.findall(findStr2)
for i in result_list2:
print(i)
print('-------------------------')
4. 完整例子
爬取豆瓣读书top250的书名
import re
import requests
import csv
url = 'https://book.douban.com/top250'
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'
}
resp = requests.get(url, headers=headers)
resp_content = resp.text
pattern = re.compile(r'<table width="100%">.*?<a href=.*?title="(?P<name>.*?)"', re.S)
it = pattern.finditer(resp_content)
with open("bookName.csv","w", encoding='utf-8') as csvFile:
writer = csv.writer(csvFile)
for i in it:
writer.writerow([i.group('name').strip()])
resp.close()