数据解析之Xpath与Jsonpath
取其精华去其糟粕
通过前面几篇文章的学习,我们已经能够处理简单的需要登录的网站并且能够去分析我们需要的目标数据所在的url了,但可以发现获取到的响应不是一段html文本就是很长的一串json串,也就是说目标数据中掺杂了很多的无用信息。不管是html也好还是json也好,我们都可以很明显的看到它们的结构就像是一个大盒子,大盒子里面又有小盒子这样的结构,而这个入口呢我们可以称其为节点(要深入了解的朋友请自行学习前端三剑,对爬虫来说还是比较重要的)。那么对于节点对应的数据我们又要如何去进行提取呢?其实刚刚已经说过啦,它就像是大盒子里面包含了小盒子,例如html中包含了body和head,body中有有div、table等,所以也能知道其具有的层次关系,所以要去提取出其中的节点的话我们只要去一层一层地剥开它的“皮”就好了。在python中的话是有很多方法能够实现我们的需求的库,在这些库的帮助下我们就能够高效准确得提取出我们需要的目标数据了。
一、Xpath的使用
xpath全称为XML Path Language,即XML路径语言,用以在XML文档中查找信息,同时也是适用于HTML文档的搜索。因此我们完全可以在爬虫中使用xpath来进行信息提取。
1.1 xpath节点关系
在XML或者HTML中的标签就是我们所说的节点,其中最外层的称为根节点。如下方代码的节点分析。
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
其转换为树结构如下图所示
其中我们就可以看到
bookstore
就是根节点,然后其包含了三个book
标签,称其为bookstore
的子节点,反之称bookstore
为book
的父节点,book
节点下又有title
、author
、year
、price
四个子节点,这四个子节点位于同一父节点下互为兄弟节点。代入代码分析是同样的道理,如下图。
1.2 lxml的使用
lxml是HTML和XML的解析器,其主要功能就是能够从XML和HTML中解析和提取数据。
安装方式:通过包管理工具pip进行安装
pip install lxml
安装完成后代码中导包进行使用即可,导包方式
from lxml import etree
导包后要将字符串实例化为Element对象,该对象具有xpath的方法,返回的结果为列表类型。
html = etree.XML(text) # 或html = etree.HTML(text) # 当为XML时表示处理XML文档,为HTML时表示处理HTML文档 result_list = html.xpath('写入xpath路径表达式')
1.3 Xpath表达式
定位语法主要依赖以下符号
表达式 说明 举例 /
从根节点开始选取