Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python爬虫库-Beautiful Soup的使用

Python爬虫库-Beautiful Soup的使用

作者头像
IT派
发布于 2018-07-30 03:40:59
发布于 2018-07-30 03:40:59
1.7K00
代码可运行
举报
文章被收录于专栏:IT派IT派
运行总次数:0
代码可运行

Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库,简单来说,它能将HTML的标签文件解析成树形结构,然后方便地获取到指定标签的对应属性。

通过Beautiful Soup库,我们可以将指定的class或id值作为参数,来直接获取到对应标签的相关数据,这样的处理方式简洁明了。

当前最新的 Beautiful Soup 版本为4.4.0,Beautiful Soup 3 当前已停止维护。

Beautiful Soup 4 可用于 Python2.7 和 Python3.0,本文示例使用的Python版本为2.7。

博主使用的是Mac系统,直接通过命令安装库:

sudo easy_install beautifulsoup4

安装完成后,尝试包含库运行:

from bs4 import BeautifulSoup

若没有报错,则说明库已正常安装完成。

开始

本文会通过这个网页http://reeoo.com来进行示例讲解,如下图所示

BeautifulSoup 对象初始化

将一段文档传入 BeautifulSoup 的构造方法,就能得到一个文档对象。如下代码所示,文档通过请求url获取:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#coding:utf-8
from bs4 import BeautifulSoup
import urllib2
url = 'http://reeoo.com'
request = urllib2.Request(url)
response = urllib2.urlopen(request, timeout=20)
content = response.read()
soup = BeautifulSoup(content, 'html.parser')

request 请求没有做异常处理,这里暂时先忽略。BeautifulSoup 构造方法的第二个参数为文档解析器,若不传入该参数,BeautifulSoup会自行选择最合适的解析器来解析文档,不过会有警告提示。

也可以通过文件句柄来初始化,可先将HTML的源码保存到本地同级目录 reo.html,然后将文件名作为参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup = BeautifulSoup(open('reo.html'))

可以打印 soup,输出内容和HTML文本无二致,此时它为一个复杂的树形结构,每个节点都是Python对象。

Ps. 接下来示例代码中所用到的 soup 都为该soup。

Tag

Tag对象与HTML原生文档中的标签相同,可以直接通过对应名字获取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tag = soup.title
print tag

打印结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<title>Reeoo - web design inspiration and website gallerytitle>
Name

通过Tag对象的name属性,可以获取到标签的名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print tag.name
# title
Attributes

一个tag可能包含很多属性,如id、class等,操作tag属性的方式与字典相同。

例如网页中包含缩略图区域的标签 article

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
<article class="box">
 <div id="main">
 <ul id="list">
 <li id="sponsor"><div class="sponsor_tips">div>
 <script async type="text/javascript" src="//cdn.carbonads.com/carbon.js?zoneid=1696&serve=CVYD42T&placement=reeoocom" id="_carbonads_js">script>
 li>
... 

获取它 class 属性的值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tag = soup.article
c = tag['class']
print c     
# [u'box']

也可以直接通过 .attrs 获取所有的属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tag = soup.rticle
attrs = tag.attrs
print attrs
# {u'class': [u'box']}

ps. 因为class属于多值属性,所以它的值为数组。

tag中的字符串

通过 string 方法获取标签中包含的字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tag = soup.title
s = tag.string
print s
# Reeoo - web design inspiration and website gallery

文档树的遍历

一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点。Beautiful Soup提供了许多操作和遍历子节点的属性。

子节点

通过Tag的 name 可以获取到对应标签,多次调用这个方法,可以获取到子节点中对应的标签。

如下图:

我们希望获取到 article 标签中的 li

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tag = soup.article.div.ul.li
print tag

打印结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<li id="sponsor"><div class="sponsor_tips">div>
<script async="" id="_carbonads_js" src="//cdn.carbonads.com/carbon.js?zoneid=1696&serve=CVYD42T&placement=reeoocom" type="text/javascript">script>
li>

也可以把中间的一些节点省略,结果也一致

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tag = soup.article.li

通过 . 属性只能获取到第一个tag,若想获取到所有的 li 标签,可以通过 find_all() 方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ls = soup.article.div.ul.find_all('li')

获取到的是包含所有li标签的列表。

tag的 .contents 属性可以将tag的子节点以列表的方式输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tag = soup.article.div.ul
contents = tag.contents

打印 contents 可以看到列表中不仅包含了 li 标签内容,还包括了换行符 '\n' 过tag的 .children 生成器,可以对tag的子节点进行循环

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tag = soup.article.div.ul
children = tag.children
print children
for child in children:
 print child

可以看到 children 的类型为 .contents 和 .children 属性仅包含tag的直接子节点,若要遍历子节点的子节点,可以通过 .descendants 属性,方法与前两者类似,这里不列出来了。

父节点

通过 .parent 属性来获取某个元素的父节点,article 的 父节点为 body。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tag = soup.article
print tag.parent.name
# body

或者通过 .parents 属性遍历所有的父辈节点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tag = soup.article
for p in tag.parents:
 print p.name
兄弟节点

.next_sibling 和 .previous_sibling 属性用来插叙兄弟节点,使用方式与其他的节点类似。

文档树的搜索

对树形结构的文档进行特定的搜索是爬虫抓取过程中最常用的操作。

find_all()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
find_all(name , attrs , recursive , string , ** kwargs
name 参数

查找所有名字为 name 的tag

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.find_all('title')
# [<title>Reeoo - web design inspiration and website gallerytitle>]
soup.find_all('footer')
# [<footer id="footer">\n<div class="box">\n<p> ... div>\nfooter>]
keyword 参数

如果指定参数的名字不是内置的参数名(name , attrs , recursive , string),则将该参数当成tag的属性进行搜索,不指定tag的话则默认为对所有tag进行搜索。

如,搜索所有 id 值为 footer 的标签

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.find_all(id='footer')
# [<footer id="footer">\n<div class="box">\n<p> ... div>\nfooter>]

加上标签的参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.find_all('footer', id='footer')
# ["footer">\n
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class="box">\n<p> ... </div>\n</footer>]
# 没有id值为'footer'的div标签,所以结果返回为空
soup.find_all('div', id='footer')
# []

获取所有缩略图的 div 标签,缩略图用 class 为 thumb 标记

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.find_all('div', class_='thumb')

这里需要注意一点,因为 class 为Python的保留关键字,所以作为参数时加上了下划线,为“class_”。

指定名字的属性参数值可以包括:字符串、正则表达式、列表、True/False。

True/False

是否存在指定的属性。

搜索所有带有 target 属性的标签

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.find_all(target=True)

搜索所有不带 target 属性的标签(仔细观察会发现,搜索结果还是会有带 target 的标签,那是不带 target 标签的子标签,这里需要注意一下。)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.find_all(target=False)

可以指定多个参数作为过滤条件,例如页面缩略图部分的标签如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
<li>
 <div class="thumb">
 <a href="http://reeoo.com/aim-creative-studios">![AIM Creative Studios](http://upload-images.jianshu.io/upload_images/1346917-f6281ffe1a8f0b18.gif?imageMogr2/auto-orient/strip)a>
 div>
 <div class="title">
 <a href="http://reeoo.com/aim-creative-studios">AIM Creative Studiosa>
 div>
li>
...

搜索 src 属性中包含 reeoo 字符串,并且 class 为 lazy 的标签:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.find_all(src=re.compile("reeoo.com"), class_='lazy')

搜索结果即为所有的缩略图 img 标签。

有些属性不能作为参数使用,如 data-**** 属性。在上面的例子中,data-original 不能作为参数使用,运行起来会报错,SyntaxError: keyword can't be an expression*。

attrs 参数

定义一个字典参数来搜索对应属性的tag,一定程度上能解决上面提到的不能将某些属性作为参数的问题。

例如,搜索包含 data-original 属性的标签

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print soup.find_all(attrs={'data-original': True})

搜索 data-original 属性中包含 reeoo.com 字符串的标签

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.find_all(attrs={'data-original': re.compile("reeoo.com")})

搜索 data-original 属性为指定值的标签

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.find_all(attrs={'data-original': 'http://media.reeoo.com/Bersi Serlini Franciacorta.png!page'})
string 参数

和 name 参数类似,针对文档中的字符串内容。

搜索包含 Reeoo 字符串的标签:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.find_all(string=re.compile("Reeoo"))

打印搜索结果可看到包含3个元素,分别是对应标签里的内容,具体见下图所示

limit 参数

find_all() 返回的是整个文档的搜索结果,如果文档内容较多则搜索过程耗时过长,加上 limit 限制,当结果到达 limit 值时停止搜索并返回结果。

搜索 class 为 thumb 的 div 标签,只搜索3个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.find_all('div', class_='thumb', limit=3)

打印结果为一个包含3个元素的列表,实际满足结果的标签在文档里不止3个。

recursive 参数

find_all() 会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False。

find()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
find(name , attrs , recursive , string , ** kwargs

find() 方法和 find_all() 方法的参数使用基本一致,只是 find() 的搜索方法只会返回第一个满足要求的结果,等价于 find_all() 方法并将limit设置为1。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.find_all('div', class_='thumb', limit=1)
soup.find('div', class_='thumb')

搜索结果一致,唯一的区别是 find_all() 返回的是一个数组,find() 返回的是一个元素。

当没有搜索到满足条件的标签时,find() 返回 None, 而 find_all() 返回一个空的列表。

CSS选择器

Tag 或 BeautifulSoup 对象通过 select() 方法中传入字符串参数, 即可使用CSS选择器的语法找到tag。

语义和CSS一致,搜索 article 标签下的 ul 标签中的 li 标签

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print soup.select('article ul li')

通过类名查找,两行代码的结果一致,搜索 class 为 thumb 的标签

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.select('.thumb')
soup.select('[class~=thumb]')

通过id查找,搜索 id 为 sponsor 的标签

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.select('#sponsor')

通过是否存在某个属性来查找,搜索具有 id 属性的 li 标签

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.select('li[id]')

通过属性的值来查找查找,搜索 id 为 sponsor 的 li 标签

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soup.select('li[id="sponsor"]')

其他

其他的搜索方法还有:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
find_parents()find_parent()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
find_next_siblings()find_next_sibling()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
find_previous_siblings()find_previous_sibling()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

参数的作用和 find_all()、find() 差别不大,这里就不再列举使用方式了。这两个方法基本已经能满足绝大部分的查询需求。

还有一些方法涉及文档树的修改。对于爬虫来说大部分工作只是检索页面的信息,很少需要对页面源码做改动,所以这部分的内容也不再列举。

具体详细信息可直接参考Beautiful Soup库的官方说明文档。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT派 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python 页面解析:Beautiful Soup库的使用
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:Python 页面解析:Beautiful Soup库的使用 ---- Python 页面解析:Beautiful Soup库的使用 1.Beautiful Soup库简介 2.Beautiful Soup库方法介绍 2.1 find_all() 2.2 find() 2.3 select() 3.代码实例 --
小嗷犬
2022/11/15
1.8K0
Beautiful Soup (一)
1、Beautiful Soup库可以说是对HTML进行解析、遍历、维护“标签树”的功能库
AiDBA宝典
2019/09/29
6070
Beautiful Soup (一)
Python3网络爬虫(七):使用Beautiful Soup爬取小说
本文总结了一些常见的网络爬虫和反爬虫技术,并介绍了一种基于Python的爬虫程序。该爬虫程序可以爬取指定网站的文章内容,并支持对某些网站的反爬虫策略。同时,还介绍了一种基于Web的爬虫程序,该程序可以爬取网站的文章列表,并支持对某些网站的反爬虫策略。
Jack_Cui
2018/01/08
4.5K0
Python3网络爬虫(七):使用Beautiful Soup爬取小说
六、解析库之Beautifulsoup模块
一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.你可能在寻找 Beautiful Soup3 的文档,Beautiful Soup 3 目前已经停止开发,官网推荐在现在的项目中使用Beautiful Soup 4, 移植到BS4 #安装 Beautiful Soup pip install beautifulsoup4 #安装
用户1214487
2018/01/24
1.7K0
爬虫系列(7)数据提取--Beautiful Soup。
官网http://beautifulsoup.readthedocs.io/zh_CN/latest/
野原测试开发
2019/07/10
1.3K0
Python爬虫技术系列-02HTML解析-BS4
参考连接: https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/# http://c.biancheng.net/python_spider/bs4.html
用户2225445
2022/11/12
9.1K0
Python爬虫技术系列-02HTML解析-BS4
python爬虫之BeautifulSoup
文章目录 1. python爬虫之BeautifulSoup 1.1. 简介 1.2. 安装 1.3. 创建BeautifulSoup对象 1.4. Tag 1.4.1. 注意: 1.4.2. get 1.4.3. string 1.4.4. get_text() 1.5. 搜索文档树 1.5.1. find_all( name , attrs , recursive , text , **kwargs ) 1.5.2. find( name , attrs , recursive , text , *
爱撒谎的男孩
2019/12/31
9380
爬虫必备Beautiful Soup包使用详解
使用Beautiful Soup解析数据 Beautiful Soup是一个用于从HTML和XML文件中提取数据的Python模块。Beautiful Soup提供一些简单的函数用来处理导航、搜索、修改分析树等功能。Beautiful Soup 模块中的查找提取功能非常强大,而且非常便捷。Beautiful Soup自动输入文档转换为Unicode编码,输出文档转换为UTF-8编码。开发者不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。 Beau
double
2022/05/12
2.7K0
爬虫必备Beautiful Soup包使用详解
一起学爬虫——使用Beautiful S
要想学好爬虫,必须把基础打扎实,之前发布了两篇文章,分别是使用XPATH和requests爬取网页,今天的文章是学习Beautiful Soup并通过一个例子来实现如何使用Beautiful Soup爬取网页。
py3study
2020/01/20
1.4K0
网络爬虫 | Beautiful Soup解析数据模块
从HTML文件中提取数据,除了使用XPath,另一种比较常用的解析数据模块。Beautiful Soup模块中查找提取功能非常强大、方便,且提供一些简单的函数来导航、搜索、修改分析树等功能。Beautiful Soup模块是Python的一个HTML解析库,借助网页的结构和属性来解析网页(比正则表达式简单、有效)。Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。
数据STUDIO
2021/06/24
5980
python爬虫从入门到放弃(六)之 BeautifulSoup库的使用
上一篇文章的正则,其实对很多人来说用起来是不方便的,加上需要记很多规则,所以用起来不是特别熟练,而这节我们提到的beautifulsoup就是一个非常强大的工具,爬虫利器。 beautifulSoup
coders
2018/01/04
1.8K0
python爬虫从入门到放弃(六)之 BeautifulSoup库的使用
python爬虫之BeautifulSoup4使用
钢铁知识库,一个学习python爬虫、数据分析的知识库。人生苦短,快用python。
钢铁知识库
2022/09/19
1.4K0
BeautifulSoup4库
和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。
HammerZe
2022/05/11
1.2K0
BeautifulSoup4库
Beautiful Soup库详解安装Beautiful Soup 介绍节点选择器方法选择器css 选择器
只需要在初始化 Beautiful Soup 时,将第二个参数设置为 lxml 即可
章鱼喵
2018/09/26
1.2K0
Beautiful Soup库详解安装Beautiful Soup 介绍节点选择器方法选择器css 选择器
python爬虫常用库之BeautifulSoup详解
这是日常学python的第16篇原创文章 经过了前面几篇文章的学习,估计你已经会爬不少中小型网站了。但是有人说,前面的正则很难唉,学不好。正则的确很难,有人说过:如果一个问题用正则解决,那么就变成了两个问题。所以说学不会是很正常的,不怕,除了正则,我们还可以用另外一个强大的库来解析html。所以,今天的主题就是来学习这个强大的库--BeautifulSoup,不过正则还是需要多多练习下的。 因为是第三方库所以我们需要下载,在命令行敲下以下代码进行下载 pip install beautifulsoup4
sergiojune
2018/04/18
8811
python爬虫常用库之BeautifulSoup详解
python︱HTML网页解析BeautifulSoup学习笔记
一、载入html页面信息 一种是网站在线的网页、一种是下载下来的静态网页。 1、在线网页 参考《python用BeautifulSoup库简单爬虫入门+案例(爬取妹子图)》中的载入内容: import
悟乙己
2018/01/02
3.3K0
《手把手带你学爬虫──初级篇》第3课 Beautiful Soup 4 库讲解
Beautiful Soup 4 库它是一个从HTML或者XML文件中提取数据的Python库。使用它,将极大地简化从网页源码中提取数据的步骤。
GitOPEN
2019/01/29
2.6K0
《手把手带你学爬虫──初级篇》第3课 Beautiful Soup 4 库讲解
Python爬虫笔记4-Beautif
与lxml一样,BeautifulSoup也是一个HTML/XML的解析器,主要功能也是如何解析和提取HTML/XML数据。
py3study
2020/01/03
7890
Python爬虫——Beautiful Soup
Beautiful Soup是Python处理HTML或XML的解析库,使用Beautiful Soup需要安装Beautiful Soup库和lxml的库 Beautiful Soup官方下载地址
羊羽shine
2019/05/28
5350
二、爬虫基础库
request模块 安装 1 pip install requests 简单使用   import requests response=requests.get("https://movie.douban.com/cinema/nowplaying/beijing/") print(response.content) # 字节数据 print(response.text) # 字符数据 print(type(response)) # <class '
用户1214487
2018/01/24
1.8K0
二、爬虫基础库
相关推荐
Python 页面解析:Beautiful Soup库的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验