目录
一、数据提取概述
1. 响应内容的分类
2. xml以及和html
二、 数据提取:jsonpath模块
三、数据提取:lxml模块
在发送请求获取响应之后,可能存在多种不同类型的响应内容;而且很多时候,我们只需要响应内容中的一部分数据
1.1 结构化的响应内容
示例:
示例:
Everyday Italian Giada De Laurentiis 2005 30.00 Harry Potter J K. Rowling 2005 29.99 Learning XML Erik T. Ray 2003 39.95
1.2 非结构化的响应内容
示例:
2.1 xml
xml是一种可扩展标记语言,样子和html很像,功能更专注于对传输和存储数据
示例:
Everyday Italian Giada De Laurentiis 2005 30.00 Harry Potter J K. Rowling 2005 29.99 Learning XML Erik T. Ray 2003 39.95 上面的xml内容可以表示为下面的树结构:
2.2 xml和html的区别
html:超文本标记语言,为了更好的显示数据,侧重点是为了显示;
xml:可扩展标记语言,为了传输和存储数据,侧重点是在于数据内容本身。
2.3 常用数据解析方法
如果有一个多层嵌套的复杂字典,想要根据key和下标来批量提取value是比较困难的。jsonpath模块就能解决这个痛点,jsonpath可以按照key对python字典进行批量数据提取。
jsonpath模块的安装
pip install jsonpath
使用方法
from jsonpath import jsonpath
ret = jsonpath(a, 'jsonpath语法规则字符串')
jsonpath语法规则
json数据
book_dict = { "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } } }
提取代码
from jsonpath import jsonpath # 返回列表,如果取不到将返回False print(jsonpath(book_dict, '$..author'))
各项数据提取:
lxml模块可以利用XPath规则语法,来快速的定位HTML\XML 文档中特定元素以及获取节点信息(文本内容、属性值);
XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言,可用来在 HTML\XML 文档中对元素和属性进行遍历。
W3School官方文档:XPath 教程
提取xml、html中的数据需要lxml模块和xpath语法配合使用
要想利用 lxml 模块提取数据,需要掌握xpath语法规则。在浏览器中可以使用xpath helper插件来测试 xpath 语法
1. 谷歌浏览器xpath helper插件的安装和使用
可以在chrome应用商城下载,如果无法下载也可以从下面我收藏在网盘的链接进行下载
链接:https://pan.baidu.com/s/1cIRqSyUS0ZF4owPuYxcTwQ?pwd=meng
提取码:meng下载完成后,把文件的后缀名crx改为rar,然后解压;
把解压后的文件夹拖入到已经开启开发者模式的chrome浏览器扩展程序界面
重启浏览器后,访问url之后在页面中点击xpath图标,就可以使用了
ps:如果是linux或macOS,直接将crx文件拖入已经开启开发者模式的chrome浏览器扩展程序界面。
2. xpath中的节点
3. xpath定位节点以及提取属性或文本内容
nodename | 选中该元素。 |
/ | 从根节点选取、或者是元素和元素间的过渡。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
text() | 选取文本。 |
示例:
选择所有的h2下的文本
//h2/text()
获取所有的a标签的href
//a/@href
获取html下的head下的title的文本
/html/head/title/text()
获取html下的head下的link标签的href
/html/head/link/@href
4. 节点修饰语法
//title[@lang="eng"] | 选择lang属性值为eng的所有title元素 |
/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。 |
关于xpath的下标
在xpath中,第一个元素的位置是1
最后一个元素的位置是last()
倒数第二个是last()-1
5. 其他常用节点选择语法
可以通过通配符来选取未知的html、xml的元素
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
node() | 匹配任何类型的节点。 |
示例:
全部的标签:
//*
全部的属性:
//node()
6. lxml模块安装
pip/pip3 install lxml
导入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
使用示例:
from lxml import etree
text = '''
-
first item
-
second item
-
third item
-
fourth item
-
a href="link5.html">fifth item
'''
html = etree.HTML(text)
#获取href的列表和title的列表
href_list = html.xpath("//li[@class='item-1']/a/@href")
title_list = html.xpath("//li[@class='item-1']/a/text()")
#组装成字典
for href in href_list:
item = {}
item["href"] = href
item["title"] = title_list[href_list.index(href)]
print(item)
ps:
lxml.etree.HTML(html_str)可以自动补全标签
lxml.etree.tostring
函数可以将转换为Element对象再转换回html字符串爬虫如果使用lxml来提取数据,应该以
lxml.etree.tostring
的返回结果作为提取数据的依据