目录
前言
我们已将整个静态网页的源代码全部抓取下来(抓取静态网页数据),并且源代码包含了最终要提取的数据。这些数据分为非结构化数据和结构化数据两种。由于这两种数据各有各的特点,因此需要采用不同的技术进行解析,提取与目标有关的数据。本文将围绕着解析网页数据的相关知识进行详细讲解。
解析网页数据的技术
Python中提供了多种解析网页数据的技术,包括正则表达式 、 XPath 、 Beautiful Soup 、 JSONPath。本文主要介绍正则表达式。
正则表达式 | XPath | Beautiful Soup | JSONPath |
1.正则表达式
正则表达式是一种文本模式,这种模式描述了匹配字符串的规则,用于检索字符串中是否有符合该模式的子串,或者对匹配到的子串进行替换正则表达式的优点是功能强大,应用广泛,缺点是只适合匹配文本的字面意义而不适合匹配文本意义。例如,正则表达式在匹配嵌套了 HTML内容的文本时,会忽略HTML内容本身存在的层次结构,而是将HTML内容作为普通文本进行搜索。
2.XPath
XPath是XML路径语言,用于从HTML或XML格式的数据中提取所需的数据XPath适合处理层次结构比较明显的数据,它能够基于HTML或XML的节点树确定目标节点所在的路径,顺着这个路径便可以找到节点对应的文本或属性值。
3.Beautiful Soup
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的 Python库它同样可以使用XPath 语法提取数据,并且也在此基础上做了方便开发者的封装,提供了更多选取节点的方式。
4.JSONPath
JSONPath的作用类似XPath,它也是以表达式的方式解析数据的,但只能解析JSON格式的数据。
若要解析纯文本,则可以选择正则表达式,若要解析 HTML或XML格式的数据,则可以选择正则表达式、XPath、 BeautifulSoup;若要解析JSON 格式的数据,则可以选择JSONPath 。为便于开发者使用这些技术,Python 提供了一些库或模块进行支持,包括re、lxml、bs4、jsonpath,其中re 模块支持正则表达式;lxml库和bs4 库支持XPath ; jsonpath 模块支持JSONPath。
正则表达式
正则表达式是对字符串操作的一种逻辑公式,它会将事先定义好的一些特定字符,以及这些特定字符的组合,组成一个规则字符串,并且通过这个规则字符串表达对给定字符串的过滤逻辑。
一条正则表达式也称为一个模式,使用每个模式可以匹配指定文本中与表达式模式相同的字符串。正则表达式由普通字符、元字符或预定义字符集组成,其中普通字符包括大小写字母和数字。
1.元字符
在正则表达式中,元字符是指具有特殊含义的专用字符,主要用于规定其前导字符在给定字符串中出现的模式。
元字符 | 说明 |
. | 匹配任何一个字符(除换行符外) |
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾 |
| | 连接多个子表达式,匹配与任意子表达式模式相同的字符串 |
[] | 字符组,匹配其中的出现的任意一个字符 |
- | 连字符,匹配指定范围内的任意一个字符 |
? | 匹配其前导字符0次或1次 |
* | 匹配其前导字符0次或多次 |
+ | 匹配其前导字符1次或多次 |
{n} | 匹配其前导字符 n次 |
{m,n} | 匹配其前导字符 m~n次 |
() | 分组,匹配子组 |
2.预定义字符集
XPath语法
以一个XML文档bookstore.xml为例:
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>、
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
bookstore # 选取 bookstore 的所有子节点
/bookstore # 选取根节点 bookstore
bookstore/book # 从根节点 bookstore 开始向下选取名为 book 的所有子节点
//book # 从任意节点开始,选取名为 book 的所有子节点
bookstore//book # 从 bookstore 的后代节点中选取名为 book 的所有子节点
//@lang # 选取所有名为 lang 的属性节点