开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天
一、本篇笔记重点内容:
- 网页结构
- 了解数据抽取的三种方法
- 使用正则表达式
- 使用Python库:Lxml、BeautifulSoup、Xpath
- 使用JSON数据处理
二、详细知识点介绍
网页结构
根据网站的组成结构,网站可以分为以下两类:
-
静态网站: 纯粹采用HTML语言编写,内容不变
-
动态网站: 服务器端动态生成:使用ASP、PHP等语言进行编写,在服务器端运行,根据浏览器请求的地址及参数,动态从数据库中读取数据,并填入预先写好的模板中,实时生成所需要的HTML网页,返回给浏览器,在浏览器看来跟静态网站没有区别 浏览器端动态加载:随时能实现更新,使用Javascript,AJAX渲染加载内容
-
对网络爬虫而言: 服务器端动态生成的网页,因为使用了模板,可以较方便地从大量非常相似的网页中抽取感兴趣的内容和数据,相当于还原了服务器的后台数据库 使用正则表达式等工具,直接从HTML页面匹配内嵌的内容 通过分析AJAX,以及Javascript等脚本,匹配动态加载的内容
了解数据抽取的三种方法
Ø 正则表达式
Ø 使用Python库:Lxml、BeautifulSoup、Xpath
Ø JSON数据处理
使用正则表达式
正则表达式可以用来检索,匹配,替换符合给定规则的字符串或者文本
正则表达式语言由两种基本字符类型组成:
- 原义(正常)文本字符
- 元字符
分组
使用正则表达式匹配重复的单字符,只需在字符后面加上相应的元字符
如果要匹配重复的字符串呢? 使用小括号() 把目标字符串包裹起来:(abc)? 可以匹配0个或者多个字符串abc
分组可以分为两种形式:捕获组和非捕获组
什么是捕获呢?
小括号包裹起来的表达式去匹配字符串,匹配的结果可以在后续的匹配过程中使用
- 把表达式中的括号进行编号,从左到右,以左括号出现的前后顺序为准,第一个出现的分组,组号即为1。
- 组号0代表正则表达式整体
- 例如,正则表达式(\d{4})-(\d{2}-(\d\d))
- 匹配 2017-04-19
非捕获组是指以 (?) 开头的分组组,它不捕获文本,没有分组编号,也不针对组合计进行计数
- 捕获组会默认把括号里的文本捕获过来以供下次使用。如果只是需要正则匹配,没有额外需求,使用非捕获组可以完成任务,降低资源消耗
- 例如: 匹配0到100范围内的整数
- 捕获组正则表达式 ^([0-99]|100)$
- 非捕获组正则表达式 ^(?:[0-99]|100)$
使用re库匹配文本的一般过程是:
- 使用compile函数将正则表达式编译为pattern对象
- 使用pattern对象检索文本,获得匹配的结果(Match对象)
- 使用Match对象获得匹配结果的信息,进行相关操作
使用Python库:Lxml、BeautifulSoup、Xpath
lxml
- 是Python语言中处理XML和HTML的第三方库:
- 底层封装C 语言编写的libxml2和libxslt包
- 提供简单有效的Python API
根据目标文本的类型,lxml提供不同的函数来去解析:
- fromstring(): 解析字符串
- HTML(): 解析HTML类型对象
- XML(): 解析XML类型对象
- parse(): 解析文件类型对象
BeautifulSoup
是Python语言中另一种解析XML/HTML的第三方解析库:
- 处理不规范标记并生成分析树 (parse tree)
- 提供简单常用的导航,搜索以及修改分析树的操作功能
与正则表达式和lxml相比,BeautifulSoup优势
- 提供python式的函数用来处理导航、搜索、修改分析树等功能
- 自动将输入编码转换为Unicode,输出编码转换为utf-8
- 为用户提供不同的解析策略或强劲的速度
- 相比正则解析,降低学习成本
- 相比XPATH解析,节约时间成本
使用JSON数据处理
JSON是指JavaScript对象表示法(JavaScript Object Notation):
- 独立于语言和平台
- 与XML类似,存储和交换文本信息
- 比XML语言更快、更易解析