前面我们学了爬虫,可以成功的爬取整个网页的内容,但是通常而言,网页中差不多 90% 的内容对于我们来说都是没有用的。所以后面我们会去学习如何从爬到的数据中,准确地找到我们所需要的数据,掌握信息解析和提取的方法。
一、信息解析与提取的一般方法(思路)
1. 完整解析信息的标记形式,再提取关键信息
- 需要标记解析器
- 优点是解析准确
- 缺点是解析过程繁琐/速度慢
2. 不解析全文,直接搜索信息
- 需要文本查找函数
- 优点是提取过程简洁,速度快
- 缺点是提取结果准确性和信息内容相关
3. 适应性方法
- 结合上述两种方法
二、不同类型信息的解析方法
有一些信息或数据是不需要进行内容解析的,例如图片、音频、视频等,而更常见的网页、文本或表格数据等是需要进行内容解析和提取的。需要解析和提取的信息可分为三类:无结构文本信息、半结构化标记型文本信息、结构化的信息。
针对不同类型的信息,有不同的信息解析方法。需要注意的是,文本信息解析不是指对全局的理解,而是指在文本中找到所需的内容,这是由于网络爬虫程序的目标是获取有价值的信息。
1. 无结构的文本信息(例如:txt文本)
- 利用正则表达式进行模式匹配
2. 半结构化的标记型文本信息(例如:html网页、json数据、xml数据等)
- html
* 正则表达式是进行模式匹配
* 利用 xpath 进行 html 标签检索
* 利用 css 选择器进行 html 标签检索
- xml
* 转化成 python 类型(xmltodict)
* xpath
* css 选择器
* 正则表达式
- json
* 利用json path 进行检索
* 利用 python 类型转换为 json 类
- yaml
3. 结构化的信息(例如:数据库文件、电子表格文件等)
- 数据库文件
* 对于 Mysql 数据库文件,可以使用 pymysql 库
* 对于 Sqllite 数据库文件,可以使用 Sqllite3 库
* 对于 MS SqlServer 数据库文件,可以使用 pyodbc+pymssql 库
* 对于 Oracle 数据库文件,可以使用 cx_oracle 库
* ......
- excel文件
* xlwings:简单强大,可替代VBA;
* openpyxl:简单易用,功能广泛;
* pandas:数据处理功能强大;
* win32com:还可以处理office其他类型文件;
* Xlsxwriter:易于生成Excel文档;
* DataNitro:内嵌于excel中,可替代VBA;
* xlutils:结合xlrd/xlwt使用。
三、正则表达式
- 内容匹配
i. \d 数字【0-9】
ii. \w 字母、数字或下划线
iii. . 任意字符
iv. [] 从里面选择任意一个值来匹配
- 数量匹配
i . * 0 - ∞ 次
ii. + 1 - ∞ 次
iii. ? 0 - 1 次
iv. {n,m} n - m 次
# 正则表达式 - 实例
# 匹配中文
'[\u4e00-\u9fa5]'
# 匹配双字节字符(含汉字)
'[^\x00-\xff]'
# 匹配空白行
'\n\s*\r'
# 匹配Email
"[\w!#$%&'*+/=?^_`{|}~]+(?:\.[\w!#$%&'*+/=?^_`{|}~]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?"
# 匹配URL
'[a-zA-z]+://[^\s]*'
# 匹配国内电话号码
'\d{3}-\d{8}|\d{4}-\{7,8}'
# 匹配腾讯QQ号
'[1-9][0-9]{4,}'
# 匹配中国邮政编码
'[1-9]\d{5}(?!\d)'
# 匹配18位身份证号
'^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$'
# 匹配年-月-日格式日期
'''([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][09]{2}|[1-9][0-9]{3})
-(((0[13578]|1[02])-(0[1-9]|[12][09]|3[01]))|((0[469]|11)
-(0[1-9]|[12][0-9]|30))|(02-(0[19]|[1][0-9]|2[0-8]))) '''
# 匹配负整数
'^-[1-9]\d*$'
# 匹配整数
'^-?[1-9]\d*$'
# 匹配正浮点数
'^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$'
#匹配负浮点数
'^-[1-9]\d*\.\d*|-0\.\d*[1-9]\d*$'