爬虫工程师都在用的爬虫利器,你知道吗?

来自:googpy(微信号:googpy),作者:stormwen

阅读文本大概需要 6.66 分钟。

最近一直在自学Python爬虫里面的「解析库的使用」,学习的过程中很多知识点边学边忘,当然,这也是每一个学习编程语言的人都会遇到的问题。所以,我准备把学习的解析库的基础知识整理出来,供大家交流学习,自己也可以随时复习。


我的计划是,把自己学习《Python3网络爬虫开发实战》的知识点,整理成读书笔记,节约大家自学的时间成本。话不多说,让我们一起来学习下这部分知识吧。


为什么要学习解析库


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


当然有啦,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篇则是带大家一起实战练习。


推荐↓↓↓
Python编程
上一篇:Asyncio之EventLoop笔记 下一篇:一份真实的Python面试题