Py | 网页爬虫解析库的理解和简单实用

相信每一位初学爬虫的小羊都会对网页HTML文档的解析感到头疼,不知道lxml、BeautifulSoup和pyquery这三个库的解析原理,下面正羊羊就讲一讲对这个网页解析过程的理解和这三个库的基本使用啦。

首先,这个网页解析是指对网页内容的提取,比如链家网上的房源信息,如下图,画红框的是我们要的信息。

然后按F12打开浏览器的监控台,或者是在红框的字体上右键点击“检查”,可以看到网页代码如下:

(先不用理会里面的代码是讲啥,不过可以留意里面的中文就是我们要的信息)

我们可以看到,每个中文信息前面,都会有红框圈起来的“标签”,像是

当然,仅靠这些标签还不行,每个标签下面依照信息的种类有不同的类别,<div标签下就分了不同的类别class:

像是这红框里面的就是不同的类别了。前面说的三种第三方库的作用,就是根据这些标签以及标签下的不同分类,提取出我们需要的信息。

所以,要想用好这三个第三方库,我们就得了解含这些标签的框架结构。

回看前面的几幅网页代码图,我们可以发现,<div标签前面的缩进是不一样的,有些前面还有一个倒三角符号。我们在网页监控台上点击这些倒三角的符号,可以让下面有进一步缩进的信息收起或展开。这也就表明,标签与标签之间,存在着一种递归关系。还是上一幅图,正羊羊将一些标签标个号,方便下面的讲解。

首先,标签1和标签2的缩进不同,由标签1引申出标签2,进一步,标签2引申出标签3~8,而标签3~8属同一级别。从而,这8个标签有如下的引申关系:

我们将各个标签成为“节点”,用亲缘关系来表达各个节点之间的关系。其中,标签1相对于标签2来讲是“父节点”(parent),标签2相对于标签1来讲是“子节点”(children)。同理,标签3~8是标签2的子节点(childrens)。在标签3~8中,各个节点互为兄弟节点(sibling),他们都是标签1的子孙节点(descendant),标签1是他们的祖节点(ancestor)。

(前文所列的英文为程序中所用名词,与英语的语法和意义无关。)

有了上面所述的知识,我们就可以用解析库啦。

lxml

为讲解方便,我们采用下图所示的HTML代码:

首先来看下这里面的标签,分别是<div>、<ul>、<li>、<a>,这四个标签层级依次递减,最外层为<div>,最内层为<a。有如下的引申关系:

程序上先导入lxml库,然后列举出<li节点下的内容:

蓝色框中有以<li为标签的3个条目,结果也输出了含3个元素的列表。这些元素表示节点<li为Element类型。(这个不重要,可以不用管)

现在我们需要留意到,这段HTML文本中的每段字符,都会由尖括号<>包围起来,除了节点

在lxml库里,这里的“item”信息被定义成text,我们用text()来表示这些文本。


就这样,我们将需要的3个“item”给提取了出来。

这里提取的原理其实很简单,就是按照标签一个跟着一个地对应起来,用text()表示要提取的信息,让xpath把这条字符串和原文匹配起来,输出每一个text()表示的内容。

举个栗子,我们把上面xpath中用于匹配的字符串改一下,把li前面的//变为/:

这是因为在li节点里没有文本,只有属于节点a的文本,所以匹配不到。如果觉得难以理解,就权且让匹配字符串开头都是//吧。

前面我们说到,紧靠标签来定位信息还是不够的,我们还需要标签里的属性,像是class。属性的匹配方法示例如下:

这就是获取a节点下属性href为”link2.html”的文本的方法。

更多功能请参照官方文档:https://lxml.de/



BeautifulSoup

相对于xpath,BeautifulSoup操作起来会容易得多,它不需要//和/这些符号来一一匹配标签(节点),而是根据属性来直接挑出文本信息。我们用下面这段HTML代码来演示:

图中红框里面的是我们关心的信息。有一点要留意,HTML代码中每个节点有相应的节点来闭合,像是第一个红框里的节点<title>,会由</title>来闭合,像是<head>、<p>、<a>都有闭合,但是<html>和<body>却没有,我们先来用BeautifulSoup来解析这段HTML文本:

可以看到,BeautifulSoup自动把</body>和</html>补齐了,这也是这个库的优点之一。

现在我们可以对里面的内容进行解析了:

可以看到,我们可以直接用标签<title>和文本代名词string来取出我们要的文本,这里的string的作用和前面说的text()作用是一样的。

在这段HTML代码中,我们可以了解到节点b的父节点为节点p,那么我们就提取p中的属性name的值:

因为是要从节点b连接到节点p,而p是b的父节点(parent),从而,用b.parent,所需信息是p中的属性(attrs),名称为name,故而用b.parent.attrs[‘name’]。显然,如果是属性class,那么方括号(索引)里的就是’class’了。

更多用法请参考官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

pyquery

这个库比BeautifulSoup更强大,这体现在其对信息的选取能力要更强。对HTML的初步解析(初始化)方法有多种,可以导入HTML文本,也可以直接写入要解析的网站网址,当然也可以让程序直接解析html文件:

具体的解析方法可以直接去看官网啦!

https://pyquery.readthedocs.io/en/latest/

看更多内容,欢迎关注公众号“正羊羊部落”

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,812评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,626评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,144评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,052评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,925评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,035评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,461评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,150评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,413评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,501评论 2 307
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,277评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,159评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,528评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,868评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,143评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,407评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,615评论 2 335

推荐阅读更多精彩内容