资讯专栏INFORMATION COLUMN

BeautifulSoup:网页解析利器上手简介

Carl / 1669人阅读

摘要:文档写得很清楚,也有中文版,你只要看了最初的一小部分,就可以在代码中派上用场了。

关于爬虫的案例和方法,我们已讲过许多。不过在以往的文章中,大多是关注在 如何把网页上的内容抓取下来 。今天我们来分享下,当你已经把内容爬下来之后, 如何提取出其中你需要的具体信息

网页被抓取下来,通常就是 str 字符串类型的对象 ,要从里面寻找信息,最直接的想法就是直接通过字符串的 find 方法切片操作


s = "

价格:15.7 元

" start = s.find("价格:") end = s.find(" 元") print(s[start+3:end]) # 15.7

这能应付一些极简单的情况,但只要稍稍复杂一点,这么写就会累死人。更通用的做法是使用 正则表达式


import re
s = "

价格:15.7 元

" r = re.search("[d.]+", s) print(r.group()) # 15.7

正则表达式是处理文本解析的万金油,什么情况都可以应对。但可惜掌握它需要一定的学习成本, 原本我们有一个网页提取的问题,用了正则表达式,现在我们有了两个问题。

HTML 文档本身是 结构化的文本 ,有一定的规则,通过它的结构可以简化信息提取。于是,就有了 lxml、pyquery、BeautifulSoup 等网页信息提取库。一般我们会用这些库来提取网页信息。其中, lxml 有很高的解析效率,支持 xPath 语法 (一种可以在 HTML 中查找信息的规则语法); pyquery 得名于 jQuery(知名的前端 js 库),可以用类似 jQuery 的语法解析网页 。但我们今天要说的,是剩下的这个:

BeautifulSoup

BeautifulSoup(下文简称 bs)翻译成中文就是“美丽的汤”,这个奇特的名字来源于《 爱丽丝梦游仙境 》(这也是为何在其官网会配上奇怪的插图,以及用《爱丽丝》的片段作为测试文本)。

bs 最大的特点我觉得是 简单易用 ,不像正则和 xPath 需要刻意去记住很多特定语法,尽管那样会效率更高更直接。 对大多数 python 使用者来说,好用会比高效更重要 。这也是我自己使用并推荐 bs 的主要原因。

接下来介绍点 bs 的基本方法,让你看完就能用起来。考虑到“只收藏不看党”的阅读体验,先给出一个“ 嫌长不看版 ”的总结:

anaconda 附带,也可以通过 pip 安装

指定 不同解析器在性能、容错性上会有差异 ,导致结果也可能不一样

基本使用流程: 通过文本初始化 bs 对象 -> 通过 find/find_all 或其他方法检测信息 -> 输出或保存

可以迭代式的查找,比如先定位出一段内容,再其上继续检索

开发时应注意不同方法的返回类型,出错时多看报错、多加输出信息

官方文档 很友好,也有中文,推荐阅读

安装

推荐使用 pip 进行安装(关于 pip 见前文《Crossin:如何安装 Python 的第三方模块》):

pip install beautifulsoup4

要注意,包名是 beautifulsoup4 ,如果不加上 4,会是老版本也就是 bs3,它是为了兼容性而存在,目前已不推荐。我们这里说 bs,都是指 bs4。

bs4 也可以直接通过安装 anaconda 获得(介绍见前文《Crossin:Python数据科学环境:Anaconda 了解一下》)。

bs 在使用时需要指定一个“ 解析器 ”:

html.parse - python 自带,但容错性不够高,对于一些写得不太规范的网页会丢失部分内容

lxml - 解析速度快,需额外安装

xml - 同属 lxml 库,支持 XML 文档

html5lib - 最好的容错性,但速度稍慢

这里的 lxml 和 html5lib 都需要额外安装,不过如果你用的是 anaconda,都是一并安装好的。

快速上手

我们就用官网上的文档作例子:


html_doc = """
The Dormouse"s story

The Dormouse"s story

Once upon a time there were three little sisters; and their names were Elsie, Lacie and Tillie; and they lived at the bottom of a well.

...

"""

使用 bs 的初始化操作,是用文本创建一个 BeautifulSoup 对象,建议手动指定解析器:


from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, "html.parser")

获取其中的某个结构化元素及其属性:


soup.title  # title 元素
# The Dormouse"s story

soup.p  # 第一个 p 元素
# 

The Dormouse"s story

soup.p["class"] # p 元素的 class 属性 # ["title"] soup.p.b # p 元素下的 b 元素 # The Dormouse"s story soup.p.parent.name # p 元素的父节点的标签 # body

并不是所有信息都可以简单地通过结构化获取,通常使用 find 和 find_all 方法进行查找:


soup.find_all("a")  # 所有 a 元素
# [Elsie,
#  Lacie,
#  Tillie]

soup.find(id="link3")  # id 为 link3 的元素
# Tillie

find 和 find_all 可以有多个搜索条件叠加,比如 find("a", id="link3", class_="sister")

find 返回的是一个 bs4.element.Tag 对象 ,这个对象可以进一步进行搜索。如果有多个满足的结果,find 只返回第一个 ;如果没有,返回 None。

find_all 返回的是一个 由 bs4.element.Tag 对象组成的 list ,不管找到几个或是没找到,都是 list。

输出:


x = soup.find(class_="story")
x.get_text()  # 仅可见文本内容
# "Once upon a time there were three little sisters; and their names were
Elsie,
Lacie and
Tillie;
and they lived at the bottom of a well."
x.prettify()  # 元素完整内容
# "

Once upon a time there were three little sisters; and their names were Elsie , Lacie and Tillie ; and they lived at the bottom of a well.

"

如果你有前端开发经验,对 CSS 选择器很熟悉,bs 也为你提供了相应的方法:


soup.select("html head title")
# [The Dormouse"s story]
soup.select("p > #link1")
# [Elsie]

以上就是 BeautifulSoup 的一个极简上手介绍,对于 bs 能做什么,想必你已有了一个初步认识。如果你要在开发中使用,建议再看下它的 官方文档 。文档写得很清楚,也有中文版,你只要看了最初的一小部分,就可以在代码中派上用场了。更多的细节可以在使用时进一步搜索具体方法和参数设置。

中文版文档 地址:

Beautiful Soup 4.2.0 文档www.crummy.com

对于爬虫的其他方面,推荐阅读我们之前的相关文章:

Chrome开发者工具:爬虫必备,掌握它就解决了一半的问题

requests:让你的爬虫开发效率提升8倍

goose 简介:一鹅在手,抓遍全球

IP代理池:听说你好不容易写了个爬虫,结果没抓几个就被封了?

selenium - 祖传爬虫利器

Python爬虫:一些常用的爬虫技巧总结

爬虫+网站开发实例:电影票比价网

════

其他文章及回答:

学编程:如何自学Python | 新手引导 | 一图学Python

开发案例:智能防挡弹幕 | 红包提醒 | 流浪地球

欢迎搜索及关注: Crossin的编程教室

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43349.html

相关文章

  • Python爬虫学习路线

    摘要:以下这些项目,你拿来学习学习练练手。当你每个步骤都能做到很优秀的时候,你应该考虑如何组合这四个步骤,使你的爬虫达到效率最高,也就是所谓的爬虫策略问题,爬虫策略学习不是一朝一夕的事情,建议多看看一些比较优秀的爬虫的设计方案,比如说。 (一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量、数据结构、语法...

    liaoyg8023 评论0 收藏0
  • Python爬虫利器二之Beautiful Soup的用法

    摘要:官方解释如下提供一些简单的式的函数用来处理导航搜索修改分析树等功能。废话不多说,我们来试一下吧安装目前已经停止开发,推荐在现在的项目中使用,不过它已经被移植到了,也就是说导入时我们需要。 上一节我们介绍了正则表达式,它的内容其实还是蛮多的,如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则表达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫Be...

    cjie 评论0 收藏0
  • 文章内容提取库 goose 简介

    摘要:是一个文章内容提取器,可以从任意资讯文章类的网页中提取文章主体,并提取标题标签摘要图片视频等信息,且支持中文网页。 爬虫抓取数据有两个头疼的点,写过爬虫的小伙伴们一定都深有体会: 网站的 防抓取 机制。你要尽可能将自己伪装成一个人,骗过对方的服务器反爬验证。 网站的 内容提取 。每个网站都需要你做不同的处理,而且网站一旦改版,你的代码也得跟着更新。 第一点没什么捷径可走,套路见得多...

    keithxiaoy 评论0 收藏0
  • Python 爬虫入门(一)——爬取糗百

    摘要:爬取糗百内容代码地址微信公众号智能制造社区,欢迎关注。爬虫程序一般是通过模拟浏览器对相应发出请求,获取数据,并通过正则等手段匹配出页面中我们所需的数据。库基本介绍是学习爬虫的一大利器。 爬取糗百内容 GitHub 代码地址https://github.com/injetlee/Python/blob/master/qiubai_crawer.py 微信公众号:【智能制造社区】,欢迎关注...

    legendaryedu 评论0 收藏0
  • python爬虫——爬取小说 | 探索白子画和花千骨的爱恨情仇

    摘要:先打开花千骨小说的目录页,是这样的。网页结构分析首先,目录页左上角有几个可以提高你此次爬虫成功后成就感的字眼暂不提供花千骨全集下载。打开盘查看花千骨文件。 知识就像碎布,记得缝一缝,你才能华丽丽地亮相。 1.Beautiful Soup 1.Beautifulsoup 简介 此次实战从网上爬取小说,需要使用到Beautiful Soup。Beautiful Soup为python的...

    newsning 评论0 收藏0

发表评论

0条评论

Carl

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<