目录
一、数据解析概述
通俗来讲,数据解析就是从你爬取到的网页里提取自己想要的信息或数据。
二、数据解析分类
re解析
bs4解析
xpath解析
三、正则表达式
1.什么是正则表达式
一种使用表达式的方式对字符串进行匹配的语法规则。 抓取到的网页源代码本质上就是一个超长的字符串,想从里面提取内容,用正则再合适不过了。2.正则优缺点
优点 | 缺点 |
---|---|
速度快,效率高,准确性高 | 新手上手难度有点高 |
正则的语法:使用元字符进行排列组合用来匹配字符串。
3.元字符
元字符:具有固定含义的特殊符号。
元字符 | 作用 |
---|---|
“.” | 匹配除换行符以外的任何字符 |
“\w” | 匹配字母或数字或下划线 |
“\s” | 匹配任意的空字符 |
“\d” | 匹配数字 |
“\n” | 匹配一个换行符 |
“\t” | 匹配一个制表符 |
[…] | 匹配字符组中的字符 在中括号里面a-z表示a到z而不表示减号 |
[^···] | 匹配除字符组中的字符 |
4.量词
控制元字符出现的次数(加在元字符的后面)
量词 | 作用 |
---|---|
* | 重复0次或更多次 |
+ | 重复一次或更多次 |
? | 重复0次或1次(出现或者不出现) |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
5.贪婪匹配和惰性匹配
推荐正则表达式在线测试网站:
https://tool.oschina.net/regex
类别 | 说明 |
---|---|
.*? | 对于匹配结果多的情况,优先匹配最短的那个 |
.* | 贪婪匹配,与上述相反 |
四.re模块
import re
代码如下(示例):
import re
1. findall
匹配字符串中所有的符合正则的内容
lst = re.findall(r"\d+","我的电话号是:10086,我女朋友电话是:10010")
print(lst)
lst2 = re.findall(r"我的.*号是","我的电话号是:10086,我女朋友电话号是:10010")
print(lst2)
结果为:
2. finditer
:匹配字符串中所有的内容【返回的是迭代器】,从迭代器中用group获得所取内容
运行结果为:
3. search
找到一个结果就返回的结果是match对象,拿数据需要.group()
s = re.search(r"\d+","我的电话号是:10086,我女朋友电话是:10010")
print(s.group())
4. match
从头开始匹配,也就是说一开始不匹配就报错
r = re.match(r"\d+","我的电话号是:10086,我女朋友电话是:10010")
print(r.group())
结果为:
r1 = re.match(r"\d+","10086,我女朋友电话是:10010")
print(r1.group())
才能运行出结果:
5. 预加载正则表达式
直接代码解释:
obj = re.compile(r"\d+")
ret = obj.finditer("我的电话号是:10086,我女朋友电话是:10010")
for it in ret:
print(it.group())
6. 正则中的内容如何单独提取
import re
a = """
<div class='jay'><span id='1'>郭麒麟</span></div>
<div class='jj'><span id='2'>宋轶</span></div>
<div class='jolin'><span id='3'>大聪明</span></div>
<div class='sylar'><span id='4'>范思哲</span></div>
<div class='tory'><span id='5'>胡说八道</span></div>
"""
#(?P<分组名字>)
obj0 = re.compile(r"<div class='.*?'><span id='\d+'>(?P<name>.*?)</span></div>",re.S)
result = obj0.finditer(a)
for its in result:
print(its.group("name"))
运行结果为: