Python 爬虫之如何对爬取到的数据进行解析
本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关。
1. 前言
在上一篇博客中,讲了如何使用 urllib 库爬取网页的数据,但是根据博客流程去操作的人应该能发现,我们爬取到的数据是整个网页返回的源码,到手的数据对我们来说是又乱又多的,让我们不能快速、准确的定位到所需数据,所以,这一篇就来讲讲如何对爬取的数据进行解析,拿到我们想要的部分。
下面会依次讲解目前市场上用的比较多的解析数据的三种方式:Xpath
、JsonPath
、BeautifulSoup
,以及这三种方式的区别。
2. Xpath
XPath(XML Path Language - XML路径语言),它是一种用来确定 XML 文档中某部分位置的语言,以 XML 为基础,提供用户在数据结构树中寻找节点的能力,Xpath 被很多开发者亲切的称为小型查询语言。
2.1 插件/库安装
首先,我们要安装 Xpath Helper 插件,借助 Xpath Helper 插件可以帮助我们快速准确的定位并获取 Xpath 路径,解决无法正常定位 Xpath 路径的问题,链接如下:https://pan.baidu.com/s/1tXW9ZtFDDiH5ZCIEpx2deQ,提取码:6666 。
安装教程如下:
- 打开 Chrome 浏览器,点击右上角小圆点 → 更多工具 → 扩展程序;
- 拖拽 Xpath 插件到扩展程序中(需开启开发者模式);
- 关闭浏览器重新打开,打开
www.baidu.com
,使用快捷键ctrl + shift + x
,出现小黑框即代表安装完毕。
安装 Xpath Helper 插件后,我们还需要在本地的 Python 环境上安装 lxml
库,命令如下:pip3 install lxml
。
2.2 基础使用
首先,我们打开Pycharm
,创建新脚本,实例化一个etree
的对象,并将被解析的页面源码数据加载到该对象中。在用 Xpath 解析文件时,会有两种情况,一种是将本地的文档源码数据加载到etree
中:
1 | from lxml import etree |
另一种是将从互联网上获取的源码数据加载到etree
中:
1 | from lxml import etree |
使用 Xpath 解析数据,最重要的便是 Xpath 表达式的书写,对 Xpath 表达式的熟悉程度将直接影响到数据解析的效率和精确度。
2.3 Xpath表达式
表达式 | 描述 |
---|---|
/ | 表示的是从根节点开始定位,表示的是一个层级 |
// | 表示的是多个层级,可以表示从任意位置开始定位 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
* | 通配符,选择所有元素节点与元素名 |
@* | 选取所有属性 |
[@attrib] | 选取具有给定属性的所有元素 |
[@attrib=‘value’] | 选取给定属性具有给定值的所有元素 |
[tag] | 选取所有具有指定元素的直接子节点 |
[tag=‘text’] | 选取所有具有指定元素并且文本内容是 text 节点 |
示例:
路径表达式 | 描述 |
---|---|
bookstore | 选取 bookstore 元素的所有子节点 |
/bookstore | 选取根元素 bookstore(加入路径起始于 /,则此路径始终代表到某元素的绝对路径) |
bookstore/book | 选取属于 bookstore 的子元素的所有 book 元素 |
bookstore/book[1] | 选取属于 bookstore 的子元素的第一个 book 元素 |
bookstore/book[last()] | 选取属于 bookstore 的子元素的最后一个 book 元素 |
bookstore/book[last()-1] | 选取属于 bookstore 的子元素的倒数第二个 book 元素 |
bookstore/book[position()<3] | 选取属于 bookstore 的子元素的前两个 book 元素 |
//book | 选取所有 book 子元素,而不管它们在文档中的位置 |
bookstore//book | 选择属于 bookstore 元素的后代的素有 book 元素,而不管它们位于 bookstore 之下的什么位置 |
//@lang | 选取名为 lang 的所有属性 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素 |
//title[@lang='eng'] | 选取所有title元素,且这些元素拥有值为 eng 的 lang 属性 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00 |
//book/title | //book/price | 选取 book 元素的所有 title 或 price 元素 |
child::book | 选取所有属于当前节点的子元素的 book 节点 |
attribute::lang | 选取当前节点的 lang 属性 |
child::* | 选取当前节点的所有子元素 |
attribute::* | 选取当前节点的属性 |
child::text() | 选取当前节点的所有文本子节点 |
child::node() | 选取当前节点的所有子节点 |
descendant::book | 选取当前节点的所哟 book 后代 |
ancestor::book | 选择当前节点的所有 book 先辈 |
ancestor-or-self::book | 选取当前节点的所有 book 先辈以及当前节点(如果此节点是 book 节点) |
child::*/child::price | 选取当前节点的所有 price 孙节点 |
//li[contains(@id,"h")] | 选取 id 属性中包含 h 的 li 标签(模糊查询) |
//li[starts-with(@id,"h")] | 选取 id 属性中以 h 为开头的 li 标签 |
//li[@id="h1" and @class="h2"] | 选取 id 属性为 h1 且 class 属性为 h2 的 li 标签 |
2.4 案例演示
2.4.1 某度网站案例
需求: 获取某度一下
。
1 | import urllib.request |
3. JsonPath
JsonPath 是一种信息抽取类库,是从 JSON 文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript、Python、PHP 和 Java。
JsonPath 对于 JSON 来说,相当于 Xpath 对于 XML。
官方文档:http://goessner.net/articles/JsonPath
3.1 库安装
在本地的 Python 环境上安装 JsonPath 库,命令如下:pip3 install jsonpath
。
3.2 基础使用
JsonPath 和 Xpath 的区别在于,JsonPath 只能对本地文件进行操作:
1 | import json |
3.2 JsonPath表达式
JsonPath | 释义 |
---|---|
$ | 根节点/元素 |
. 或 [] | 子元素 |
.. | 递归下降(从 E4X 借用了这个语法) |
@ | 当前节点/元素 |
?() | 应用过滤表达式,一般需要结合 [?(@ )] 来使用 |
[] | 子元素操作符,(可以在里面做简单的迭代操作,如数据索引,根据内容选值等) |
[,] | 支持迭代器中做多选,多个 key 用逗号隔开 |
[start:end:step] | 数组分割操作,等同于切片 |
() | 脚本表达式,使用在脚本引擎下面 |
更多表达式用法可查看官方文档:http://goessner.net/articles/JsonPath。
3.3 案例演示
需求: 获取淘票票
数据。
1 | import json |
4. BeautifulSoup
BeautifulSoup 是 Python 的一个 HTML 的解析库,我们常称之为 bs4,可以通过它来实现对网页的解析,从而获得想要的数据。
在用 BeautifulSoup 库进行网页解析时,还是要依赖解析器,BeautifulSoup 支持 Python 标准库中的 HTML 解析器,除此之外,还支持一些第三方的解析器,如果我们不安装第三方解析器,则会试用 Python 默认的解析器,而在第三方解析器中,我推荐试用 lxml,它的解析速度快、容错能力比较强。
解析器 | 使用方法 | 优势 |
---|---|---|
Python 标准库 | BeautifulSoup(markup, “html.parser”) | Python 的内置标准库、执行速度适中、文档容错能力强 |
lxml HTML 解析器 | BeautifulSoup(markup, “lxml”) | 速度快、文档容错能力强 |
lxml XML 解析器 | BeautifulSoup(markup, [“lxml”, “xml”]) 或 BeautifulSoup(markup, “xml”) | 速度快、唯一支持 XML 的解析器 |
html5lib | BeautifulSoup(markup, “html5lib”) | 最好的容错性、以浏览器的方式解析文档、生成 HTML5 格式的文档、不依赖外部扩展 |
4.1 库安装
在本地的 Python 环境上安装 BeautifulSoup 库,命令如下:pip3 install bs4
。
4.2 基础使用
1 | from bs4 import BeautifulSoup |
BeautifulSoup类基本元素:
基本元素 | 说明 |
---|---|
Tag | 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾 |
Name | 标签的名字,<p>…</p> 的名字是 ’p’,格式:<tag>.name |
Attributes | 标签的属性,字典组织形式,格式:<tag>.attrs |
NavigableString | 标签内非属性字符串,<>…</>中字符串,格式:<tag>.string |
Comment | 标签内字符串的注释部分,一种特殊的 Comment 类型 |
4.3 常见方法
1 | soup.title # 获取html的title标签的信息 |
4.4 案例演示
需求: 获取星巴克
数据。
1 | from bs4 import BeautifulSoup |
参考文献
【1】https://blog.csdn.net/qq_54528857/article/details/122202572
【2】https://blog.csdn.net/qq_46092061/article/details/119777935
【3】https://www.php.cn/python-tutorials-490500.html
【4】https://zhuanlan.zhihu.com/p/313277380
【5】https://blog.csdn.net/xiaobai729/article/details/124079260
【6】https://blog.51cto.com/u_15309652/3154785
【7】https://blog.csdn.net/qq_62789540/article/details/122500983
【8】https://blog.csdn.net/weixin_58667126/article/details/126105955
【9】https://www.cnblogs.com/surpassme/p/16552633.html
【10】https://www.cnblogs.com/yxm-yxwz/p/16260797.html
【11】https://blog.csdn.net/weixin_54542209/article/details/123282142
【12】http://blog.csdn.net/luxideyao/article/details/77802389
【13】https://achang.blog.csdn.net/article/details/122884222
【14】https://www.bbsmax.com/A/gGdXBNBpJ4/
【15】https://www.cnblogs.com/huskysir/p/12425197.html
【16】https://zhuanlan.zhihu.com/p/27645452
【17】https://zhuanlan.zhihu.com/p/533266670
【18】https://blog.csdn.net/qq_39314932/article/details/99338957
【19】https://www.bbsmax.com/A/A7zgADgP54/
【20】https://blog.csdn.net/qq_44690947/article/details/126236736