大家好,欢迎回到网络爬虫专题。上一章讲完了获取HTML文档的操作。这一章将讲述爬虫中最重要的部分,解析(提取)HTML文档信息。服务器给我们的HTML文档往往有几千上万行代码,然而数据只是其中一部分,我们不可能手动逐行删改,这就失去了爬虫的意义。
提取HTML文档信息,目前主要有三种方式:re(正则表达式)、BS4(BeautifulSoup)和Xpath。这三种方式各有优劣。
解析方式 |
解析速度 | 上手难度 |
BS4 |
慢 |
易 |
Xpath |
中 |
中 |
re |
快 | 难 |
这三种方式以后都会提到,Mark先从Xpath开始主要是因为re需要有一点思维基础(可以从Xpath中锻炼),而BS4因为上手简单,已经有很多文章都在讲了。BS4对于小任务量的提取是很方便的,但是任务量一旦提高,就能明显感觉到耗时增加。
Xpath语言,即XML Path Language(XML路径语言),是一种用来确定XML文档或HTML文档中某部分位置的语言。可以在文档中对元素和属性进行遍历。这里的XML是什么就不在过多地解释了,知道Xpath语言常用于查找信息即可。
Xpath查找数据主要依靠的是规则。前文提到,HTML文档是一种超文本的文档,其中包含有层级的标签,要提取其中的数据就要遵循一定的规则,Xpath语言会利用HTML文档中的标签信息来编写这种规则。
与其说Xpath是一种语言,不如说它是一款工具。将Xpath插件安装到谷歌浏览器中,就可以在网页上实时进行数据筛选,得到规则之后就可以移植到爬虫程序中,让爬虫程序自动爬取。
Xpath插件获取方式如下(百度网盘):
链接:https://pan.baidu.com/s/1QjDOp75Cc-AaCMNKJ9grOw
提取码:1234
Xpath插件是一个.crx文件,安装时可能会出现失败的问题,建议大家将后缀名.crx修改为.rar,并解压到一个不变的位置。安装到谷歌浏览器后一旦修改位置需要重新安装插件。
安装插件的方式:进入谷歌浏览器后点击右上方的三个点,选择“更多工具”,然后选择扩展程序。
Xpath作为一款查找语言,其语法非常简单。以下表格就是常用的Xpath语句的节点选取部分。
表达式 |
描述 |
示例 |
示例说明 |
nodename (标签名) |
选取节点下的所有子节点 | div |
选取div下的所有子标签 |
// |
从全局中选取节点 | //div |
选取整个HTML文档下的div标签 |
/ |
选取某节点下的子节点 |
//div/title | 选取div标签下的所有title标签 |
@ |
选取带某个属性的节点 | //div[@id] |
选取div标签下所有包含id属性的标签 |
. |
当前节点下 |
./span |
选择当前节点下的span标签 |
这里最重要的是//、/、@和 . 四个语法,通过这四种语法大部分的数据都能提取出来。“ . ”这种方式会在下一章爬虫代码中应用更多一些,这里知道即可。(用过shell应该知道它表示当前目录下,这里和“当前目录下”意思差不多)
以百度首页为例,演示几个简单的例子。
(1)输入//a,表示选取整个HTML文档中的所有a标签。
可以看到右边result中显示了所有名称为a标签的内容,一共53个,并在页面上以黄色做了标记。使用这种方式,在a标签之下的所有标签都会被取出来。热搜内容在a标签之下,本身是一个span标签,也被取了出来。
从结果可以看出提取出了a标签下的所有span标签,并且每个span标签都分别显示。和上一个例子不同,这里的“沸”,不再和“马龙卫冕男单金牌”合并为一条信息。
(3)有时前两种方式不能完成信息的筛选,就要用到@,利用标签的属性进行筛选。
上一个例子中除了热搜,还拿到了很多span标签的内容,如果只需要热搜内容,就可以输入//a/span[@class="title-content-title"]。即可拿到所有热搜的内容。
谓语部分主要用于查找的细节问题,比如需要第n个数据而不是所有的数据。谓语很好理解,上边的根据属性查找就有谓语的应用。
表达式 |
意义 |
//div/a[1] |
选择div标签下的第一个a标签 |
//div/a[k] |
选择div标签下的第k个a标签 |
//div/a[last()] |
选择所有div标签下的最后一个a标签 |
//div/a[position()<3] |
选择所有div标签下的前两个a标签 |
//div/a/@class |
选择所有div标签下的a标签的class属性 |
这里有两点注意,第一是Xpath语言和python不同,Xpath语言的第一个就是1,而不是0。第二就是谓语中最后一行显示属性的方法,有时某些数据会写在属性中而不是作为汉字写在<>之外,所以要知道如何提取属性信息。
Xpath的通配符有两个。
通配符 |
意义 |
示例 |
说明 |
* |
匹配任意节点 |
//div/* | 选择div中的所有子标签 |
@* |
匹配任意属性 |
//div[@*] |
选择有属性的所有div标签 |
注意@*,如果div标签没有属性值,则不会被选中。
当选择多个路径时,可以使用“ | ”表示。例如//div | //head,表示选取div和head两个标签中的内容。
有一点注意,Xpath语法主要显示的是<>以外的中文(非设定显示属性的情况下),有时标签内没有中文,在result框内就没有数据显示,但是结果数量非零。
使用Xpath编写筛选规则的前提是对HTML文档的结构有一定的认知,HTML网页的结构是规则的,同一类型的信息一般都在相同的结构之下。
查找相同内容时有可能会出现不同的Xpath语句,尽可能地掌握较多的查询规则,在爬虫程序中因为网站更新,网页变化等原因可能导致某个规则无法使用,这时掌握另外的查询规则就能更方便地找到数据。
(1)爬取百度首页左上角的“新闻”、“新闻的链接”等内容。
方法:先找到爬取内容在HTML文档的位置,根据标签信息和标签的层次关系编写筛选规则。如果当前标签名称不能定位,要找上一级标签,上一级标签(一般找两到三级标签)无法定位考虑用属性和各种Xpath谓语。
<div id="1">XXX
<div id="2">YYY
<p>ZZZ
</p>
</div>
</div>
这一章主要讲述了Xpath语法的相关内容,其实谷歌浏览器提供了直接复制Xpath的方式,能直接拿到对应信息的Xpath查询规则。
但是Mark希望大家能明白Xpath语法的意义,一旦谷歌提供的查询规则不能使用,能自己动手写出另一种规则,而不是只知道Ctrl C+Ctrl V。
这章主要内容不在于编程,而是熟练使用Xpath的基本语法。熟悉这些语法,大部分的数据都能从HTML文档中提取到。再将这种规则应用于爬虫程序,就能实现自动化爬取相关内容。
欢迎大家留言。
发表评论