数据提取
数据提取概述
1.响应内容分类
-
结构化的响应内容
- json 字符串(高频出现)
- json 模块
- re 模块
- jsonpath 模块
- xml 字符串(低频出现)
- re 模块
- lxml 模块
- json 字符串(高频出现)
-
非结构化的响应内容
-
html 字符串
-
re 模块
-
lxml 模块
-
-
2.认识 xml 以及 html 的区别
xml
- xml 被设计为传输和存储数据,其焦点时数据的内容
html
- 显示数据以及如何更好显示数据
数据提取-jsonpath 模块
1. jsonpath 模块的使用场景
如果有一个多层嵌套的复杂字典,想要根据 key 和下标来批量提取 value,这是比较困难的。jsonpath 模块就能解决这个痛点
2. jsonpath 模块的使用方法
2.1 jsonpath 模块的安装
pip install jsonpath
2.2 jsonpath 模块提取数据的方法
from jsonpath import jsonpath
ret = jsonpath(a,'jsonpath 语法规则字符串')
2.3 jsonpath 语法规则
JSONPath | 描述 |
---|---|
$ | 根节点 |
. | 现行节点 |
… | 子孙节点 |
数据提取-lxml 模块
1.了解 lxml 模块和 Xpath 语法
对 html 或 xml 形式的文本提取特定的内容,就需要我们掌握 lxml 模块的使用和 xpath 语法
- lxml 模块可以利用 XPath 规则语法,来快速定位 HTML\XML 文档中特定元素以及获取节点信息(文本内容、属性值)
- XPath 是一门在 HTML\XML 文档中查找信息的语言,可用来在 HTML\XML 文档中对元素和属性进行遍历
- 提取 xml、html 中的数据需要 lxml 模块和 XPath 语法配合使用
2.谷歌浏览器 XPath Helper 插件的安装与使用
要想利用 lxml 模块提取数据,需要我们掌握 XPath 语法规则,接下来我们就来了解一下 XPath Helper 插件,它可以帮助我们练习 XPath 语法
3. XPath 语法-选取节点以及提取属性或文本内容的语法
- XPath 使用路径表达式来选取 XML 文档中的节点或者节点集
- 这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似
- 使用 Chrome 插件选择标签时,选中时,选中的标签会添加属性 class = “xh-highlight”
3.1 XPath 定位节点以及提取属性或文本内容的语法
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
text() | 取文本 |
4.XPath 语法-选取特定节点的语法
可以根据标签的属性值、下标等来获取特定的节点
4.1选取特定节点的语法
路径表达式 | 结果 |
---|---|
//title[@lang=“eng”] | 选取 lang 属性值为 eng 的所有 titile 元素 |
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素 |
/bookstore/book[position()>1] | 选取属于 bookstore下面的 book 元素,从第二个人开始选取 |
//book/title[text()=“Harry Potter”] | 选取所有 book 下的 title 元素,仅仅选择文本为 Harry Potter 的 title 元素 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有title 元素,且其中的 price 元素的值须大于35.00 |
//div[contains(@id,“qiushi_tag_”)] | |
//span[contains(text(),“下一页”)] |
5.XPath 语法-选取未知节点语法
可以使用通配符来选取未知的 html、xml 的元素
5.1选取未知节点的语法
通配符 | 描述 |
---|---|
* | 匹配任何节点 |
@* | 匹配任何属性节点 |
node() | 匹配任何类型的节点 |
//td/a|//h2/a | 匹配 //td/a 或者 //h2/a |
6.lxml 模块的安装与使用
lxml 模块是一个第三方模块,安装之后使用
6.1lxml 模块的安装
pip install lxml
6.2lxml 模块的使用
-
导入 lxml 的 etree 库
from lxml import etree
-
利用 etree.HTML,将 html 字符串(bytes 类型或 str 类型)转化为 Element 对象,Element 对象具有 XPath 的方法,返回结果的列表
html = etree.HTML(text) ret_list = html.xpath("XPath 语法规则字符串")
-
XPath 方法返回列表的三种情况
- 返回空列表:根据 XPath 语法规则字符串,没有定位到任何元素
- 返回由字符串构成的列表:XPath 字符串规则匹配的一定是文本内容或者某属性的值
- 返回由 Element 对象构成的列表:XPath 规则字符串匹配的是标签,列表中的 Element 对象可以继续进行 XPath