Python爬虫利器:Beautiful Soup的使用(一)

上一次的爬取网易新闻案例,我们使用到了一个解析 HTML 的库:Beautiful Soup。本次跟大家分享一下关于这个库的一些用法。

Beautiful Soup 简介:

Beautiful Soup 是一个可以从 HTML 或者 XML 文档中提取数据的 Python 库,

它提供一些简单的函数可以很方便的从文档上提取所需要的数据。由于目前最新版本是 4.4.0,所以一般被简称为 bs4。

安装:

在这里强烈推荐使用 Anaconda,Anaconda指的是一个开源的 Python 发行版本,包含了科学计算或者数据分析所用的等180多种依赖包。而且 window 下面的安装也是非常简便,一路下一步就行了。

至于为什么推荐使用 Anaconda,一方面是由于以上所说的包含了常用的库,而另一方面则是为了不让大家在安装环境这一步浪费太多时间。由于 Python 目前常用的依赖管理是 pip,新手很容易在这里遇到一些自身不容易解决的问题。很容易打击自己的信心,造成负面的心理反馈。而我们要使用的 Beautiful Soup 本身也已经集成到 Anaconda 中了。我们只需 import 导入即可。

废话不多说了,下面开始介绍 bs4 的使用。

开始使用之前,先介绍一下 bs4 可以使用的解析器。

bs4 支持 Python 标准库中的 HTML 解析器,另外还支持一些第三方的解析器:其中一个是 lxml,另一个可供选择的解析器是纯Python实现的 html5lib, html5lib的解析方式与浏览器相同。html5lib 相比较 lxml 来说容错能力更强,且不依赖外部扩展,但是速度却不如后者。lxml 还需要安装C语言库。不过我们使用的是 Anaconda,这些都是现成的,开箱即用。

bs4 导入:

from bs4 import BeautifulSoup

BeautifulSoup 的构造方法接收一段字符串或一个文件句柄,从而得到一个文档的对象。可以通过这个对象来对我们传入的文档来进行操作。

接收字符串:

str = """ <!DOCTYPE html> <html> <head>
<title>bs4使用</title> </head> <body>
<h1>BS4使用。</h1> </body> </html> """
bs4 = BeautifulSoup(str, "lxml")
print(type(bs4)) # <class 'bs4.BeautifulSoup'>

接收文件句柄:

bs4 = BeautifulSoup(open('a.html', mode='r', encoding='UTF-8'), "lxml")
print(type(bs4)) # <class 'bs4.BeautifulSoup'>

Beautiful Soup 将 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象可以归纳为4种: Tag, NavigableString, BeautifulSoup, Comment

一、Tag对象

Tag 其实就是 HTML 中的一个标签,与原生 HTML 文档中的标签相同。下面是示例:

str = """
<h1 class="h1">Hello BeautifulSoup</h1>
"""
soup = BeautifulSoup(str, "lxml")
tag = soup.h1print(type(tag)) # <class 'bs4.element.Tag'>

我们构造一个 BeautifulSoup 对象之后可以直接通过访问对象属性的方式来获取一个 Tag 对象,Tag 对象具有很多属性和方法。可包含多个Tag以及字符串,这些都是这个Tag的子节点。我们只介绍一下 Tag 中最重要的属性: name 和attributes

Name属性:

还是上边的例子,我们修改 tag 的 name 属性,之后打印它,发现原来的 h1 标签被修改为 h2,也就是说如果改变了 tag 对象的 name 属性,那将影响所有通过当前 Beautiful Soup 对象生成的 HTML 文档。

print(tag.name) # h1
tag.name = "h2"
print(tag) # <h2 class="h1">Hello BeautifulSoup</h2>

Attributes属性:

还是上边的例子,<h1 class="h1">Hello BeautifulSoup</h1>这个标签含有一个 class 属性,值为“h1”。

tag 的属性可以被添加,删除或修改,操作方法与字典一样。

print(tag) # <h1 class="h1">Hello BeautifulSoup</h1>
tag['class'] = "h2"
print(tag) # <h1 class="h2">Hello BeautifulSoup</h1>

二、NavigableString对象

上面例子中 h1 标签中间的字符串,可以通过 tag.string 来获取。通过上面的 Tag 对象获取到标签的内容之后可以通过 .string 获取。前提是 tag 只有一个 NavigableString 类型子节点。

print(type(tag.string)) # <class 'bs4.element.NavigableString'> print(tag.string) # Hello BeautifulSoup

tag 中包含的字符串不能编辑,但是可以被替换。

tag.string.replace_with("AAAAA")
print(tag.string) # AAAAA

三、BeautifulSoup对象

BeautifulSoup 对象表示的是一个文档的全部内容。很多时候可以把它当作一个特殊的 Tag 对象。

四、Comment对象

Tag, NavigableString, BeautifulSoup 几乎覆盖了 html 和 xml 中的所有内容,但是还有一些特殊对象,比如文档注释。

例子:

str = """
<b></b><h1 class="h1">Hello BeautifulSoup</h1>
"""
soup = BeautifulSoup(str, "lxml")
comment = soup.b.stringprint(type(comment)) # <class 'bs4.element.Comment'>
print(comment) # 这里是注释

到这里已经介绍完了对象的种类。BeautifulSoup 还有最重要的部分:文档树。打算下次在写。

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

推荐阅读更多精彩内容