数据解析
一、正则表达式
Regular Expression,正则表达式是一种使用表达式的方式对字符串进行匹配的语法规则。
我们抓取到的网页源代码本质上就是一个超长的字符串, 想从里面提取内容。用正则再合适不过了。
正则的优点: 速度快, 效率高, 准确性高
正则的缺点: 新手上手难度有点高。
不过只要掌握了正则编写的逻辑关系, 写出一个提取页面内容的正则其实并不复杂。
正则的语法: 使用元字符进行排列组合来匹配字符串。在线测试正则表达式https://tool.oschina.net/regex/
元字符: 具有固定含义的特殊符号 常用元字符有以下:
. 匹配除换行符以外的任意字符 w 匹配字母或数字或下划线 s 匹配任意的空白符 d 匹配数字 匹配一个换行符 匹配一个制表符 ^ 匹配字符串的开始 $ 匹配字符串的结尾 W 匹配非字母或数字或下划线 D 匹配非数字 S 匹配非空白符 a|b 匹配字符a或字符b () 匹配括号内的表达式,也表示一个组 [...] 匹配字符组中的字符 [^...] 匹配除了字符组中字符的所有字符
量词:控制前面的元字符出现的次数
* 重复零次或多次 + 重复一次或多次 ? 重复零次或一次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次
贪婪匹配和非贪婪匹配
- 贪婪匹配:匹配更多的字符
-
非贪婪匹配:匹配尽可能少的字符(*、+、?后带?)
str:‘I love China,I love my homeland,I love China’ reg: I.*China 此时匹配的是:'I love China,I love my homeland,I love China' reg:I.*?China 此时匹配的是:'I love China'
带HTML标签
str:<div>I love China</div> reg:<.*> 匹配结果:<div>I love China</div> reg:<.*?> 匹配结果:<div> </div> str:<div>I love China</div><span>I love my homeland</span> reg:<div>.*?</div> 匹配结果:<div>I love China</div>
二、re模块匹配HTML标签
import re s = """ <div class='ex1111'><span id='1'>Jack</span></div> <div class='ex2222'><span id='2'>Rose</span></div> <div class='ex33333'><span id='3'>Merry</span></div> <div class='ex44444'><span id='4'>Job</span></div> <div class='ex55555'><span id='5'>Smith</span></div> """ obj = re.compile(r"<div class='ex(.*?)'><span id='(?P<ttt>d+?)'>(.*?)</span></div>", re.S) res = obj.finditer(s) for i in res: print(i.group(1), i.group('ttt'), i.group(3))
三、豆瓣爬取前250
import re import requests import csv headers = {'User-Agent': 'Mozilla/5.0 (Windows;U;Windows NT 6.1;en-US;rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'} url = 'https://movie.douban.com/top250' resp = requests.get(url, headers=headers) page_content = resp.text obj = re.compile(r'<li>.*?<span class="title">(?P<name>.*?)</span>' r'.*?<p class="">.*?<br>(?P<year>.*?) ', re.S) result = obj.finditer(page_content) f = open('data.csv', 'w', encoding='utf-8') csvwriter = csv.writer(f) for i in result: dic = i.groupdict() dic['year'] = dic['year'].strip() print(dic) csvwriter.writerow(dic.values())
f.close()