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

阅读文本大概需要 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篇则是带大家一起实战练习。

原文发布于微信公众号 - googpy(googpy)

原文发表时间:2019-06-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券