Python爬虫利器之解析库的使用

对于一个刚学Python爬虫的新手来说,学习Python爬虫里面的「解析库的使用」如果没有超强记忆力,估计是边学边忘,正所谓好记性不如烂笔头,在自己学些爬虫相关的知识点可以记录下来然后多次实践肯定比单凭记忆力要记得牢,下面我就把我学习的一些解析库的知识整理出来,供大家参考下。

我的计划是,把自己学习记录的知识点,整理成读书笔记,节约大家自学的时间成本。话不多说,让我们一起来学习下这部分知识吧。

为什么要学习解析库

我们实现一个最基本的爬虫,提取页面信息时会使用正则表达式。正则表达式虽然提取信息速度很快,但是万一正则表达式有地方写错了,可能导致匹配失败,而且复杂项目的正则表达式很烦琐,那么有没有另一种方便快捷的方法呢?

当然有啦,Python以它强大的库功能,给我提供了高效的方法——解析库。

什么是解析库

解析库意思是解析某个特定的内容,一个爬虫的思路非常简单,即向服务器发起请求,得到响应后,根据返回的内容做进一步处理。一般返回的内容是网页的源代码,有时候还会是json数据。针对网页源代码,我们就需要用解析库来解析我们想要的内容。

常用的解析库有3种:

1、lxml
2、Beautiful Soup
3、pyquery

其中lxml库使用的是Xpath语法,是一种效率较高的解析方法,那么今天我们就详细介绍下Xpath的使用,此教程一共分为三篇,今天是第一篇。

什么是Xpath?

Xpath,全称XML Path Language,即XML路径语言,是一门在XML文档中查找信息的语言。它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。

所以在做爬虫时,我们完全可以使用Xpath来做相应的信息抽取。接下来介绍下Xpath的基本用法。

1、Xpath概况

在这里插入图片描述

Xpath选择功能十分强大,它提供了非常简洁明了的路径选择表达式。另外,它还提供了100个内置函数,用于字符串、数值、时间的匹配以及节点、序列的处理等。

2、Xpath常用规则

这个表格里的知识大家一定要掌握,并且要熟记于心,只有写出正确的表达式,才能写出正确的Xpath解析式,我们才能进行HTML的解析。

举例说明:

//title[@lang=‘eng’]

表示的是所有名称为title,同时属性lang的值为eng的节点。

3、准备工作

使用Xpath之前,首先要确保安装好lxml库。安装方法非常简单。

pip3 install lxml

4、实例引入

现在通过实例来感受一下使用Xpath对网页解析的过程,相关代码如下:

from lxml import etree

text= '''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''

html = etree.HTML(text)
result = etree.tostring(html)
print(result.decode('utf-8'))

这里首先导入lxml库的etree模块,然后声明了一段HTML文本,调用HTML类进行初始化,这样就成功构造了一个Xpath解析对象。这里需要注意的是,HTML文本的最后一个li节点是没有闭合的,但是etree模块可以自动修正HTML文本。

这里我们调用tostring()方法即可输出修正后的HTML代码,但是结果是bytes类型。这里利用decode()方法将其转成str类型,结果如下:

<html><body><div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</li></ul>
</div>
</body></html>

我们可以看到,经过处理之后,li节点标签被补全,并且还自动添加了body、html节点。

另外,也可以直接读取文本文件进行解析,示例如下:

from lxml import etree

html = etree.parse('./test.html',etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8'))

其中test.html的内容就是上面例子中的HTML代码,内容如下:

<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>

这里需要注意的是,为了成功运行程序,需要新建一个名为test.html的HTML文件,而不是像上面那样简单的进行声明。

这次的输出结果略有不同,多了一个DOCTYPE的声明,但是对解析无任何影响,结果如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div>&#13;
<ul>&#13;
<li class="item-0"><a href="link1.html">first item</a></li>&#13;
<li class="item-1"><a href="link2.html">second item</a></li>&#13;
<li class="item-inactive"><a href="link3.html">third item</a></li>&#13;
<li class="item-1"><a href="link4.html">fourth item</a></li>&#13;
<li class="item-0"><a href="link5.html">fifth item</a>&#13;
</li></ul>&#13;
</div></body></html>

总结

今天我们介绍了什么是Xpath,Xpath有什么用,以及Xpath如何使用等知识,关于Xpath我计划写三篇文章,今天这篇主要是基础知识的介绍,第2篇详细介绍Xpath的操作,第3篇则是带大家一起实战练习。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44617651/article/details/129871787