BeautifulSoup是最初学习Python抓取网页时都会用到的一个库,可以使HTML内容结构化,从而更方便的获取内部数据,可以说是pythoner居家必备的model之一。本文主要对BeautifulSoup的安装与应用作简单的介绍。
1. BeautifulSoup安装
linux安装
- 可以通过系统软件包来安装:
$ apt-get install Python-bs4
; - 也可以通过
easy_install
或pip
安装:$ easy_install beautifulsoup4
,$ pip install beautifulsoup4
。
windows安装
- 可以在官方地址下载源码,然后通过
python setup.py install
安装; - 也可以通过
easy_install
或pip
安装,方法同上。
2. 简单浏览结构化数据
使用BeautifulSoup对HTML内容解析之后,HTML内容就变成了结构化数据,可以轻易对其中的DOM元素进行操作,比如获取数据,修改,删除等。
import requests
from bs4 import BeautifulSoup as bsp
url = 'http://www.zhidaow.com/'
r = requests.get(url)
soup = bsp(r.content) # 得到结构化数据soup
print soup.title # 定位title标签
# <title>
#张亚楠 ' BLOG - 天意从来高难问
# </title>
print soup.title.name # title标签的名称
#title
print soup.title.string # title标签中文本内容
#张亚楠 ' BLOG - 天意从来高难问
print soup.h2 # 定位HTML中第一个h2标签
# <h2 class="title"><a href="/post/python-beautifulsoup" ><i class="fa fa-leaf"></i>Python BeautifulSoup4安装与简单应用</a>
# </h2>
print soup.h2['class'] # 第一个h2标签的class属性
#[u'title']
print soup.body.div.div.a # 获取到导航中第一个链接
#<a href="/">Home</a>
3. find_all和find对dom元素进行搜索
上一部分DOM元素的操作可以看到,可以通过简单的方法浏览到结构化数据,但精细的数据就不方便获取了,于是就用到了find_all()
和find()
两个搜索方法。
find_all()
是搜索整个dom树,并以list形式返回所有符合条件的元素;find()
也是搜索dom树,只是找到第一个就返回结果。
接上一部分的代码继续示例:
print soup.find_all('h2') # 查找所有的标题
'''
[<h2 class="title"><a href="/post/python-beautifulsoup"><i class="fa fa-leaf"></i>Python BeautifulSoup4安装与简单应用</a>
</h2>, <h2 class="title"><a href="/post/python/2015-07-29"><i class="fa fa-leaf"></i>2015-07-29</a>
</h2>, <h2 class="title"><a href="/post/python-envelopes"><i class="fa fa-leaf"></i>Python用Envelopes发送邮件和附件</a>
</h2>, <h2 class="title"><a href="/post/people-who-live-with-monkey"><i class="fa fa-leaf"></i>这就是耍猴人 - 读《最后的耍猴人》有感</a>
</h2>, <h2 class="title"><a href="/post/scrapy-save-as-excel"><i class="fa fa-leaf"></i>Scrapy数据保存为excel</a>
</h2>]
'''
print soup.find('div', class_='powered_by').a.string # 查找支持信息里的文本信息
#Proudly Powered By FarBox.com
import re
print soup.find_all(text=re.compile('2015-04')) # 查找在2015-04发布的文章日期
#[u'2015-04-28 15:53', u'2015-04-24 17:01']
print soup.find_all('p', text=re.compile(u'书')) # 查找包含“书”的p标签
#[<p>我是在亚马逊图书编辑3月推荐书单中看到这本书的,编辑荐语中简单介绍了当代耍猴人的生活,猴与耍猴人的依赖。</p>, <p>2014年应该是我最急躁的一年,搬家,装修,还账,每天都搞得急匆匆,幸好一直读书,能稍微喘口气。</p>, <p>我主要在上下班的地铁上读书,每天加起来差不多一个小时,一年下来也读了20+本,平均一个月2本多。从书的类型来看,小说故事书偏多,历史,悬疑,纪实各类主题都有,专业书籍几乎没有(也符合我2014年目标不明确的情况)。</p>]
提醒:以上只是find_all()
和find()
的几个简单例子,由于篇幅有限无法一一列举,希望各位读者应用时举一反三,多测试。
4. BeautifulSoup其他实用功能
- BeautifulSoup默认选用Python标准库
html.parser
作为解析器,其实可以更改为lxml解析器,速度更快,容错能力也更强; - 所有文字在BeautifulSoup中都将转化为Unicode,因为BeautifulSoup自带了一个编码自动检测器,如下代码所示:
#coding=utf8
from bs4 import UnicodeDammit
im = '悟缘'
print type(im)
#<type 'str'>
dammit = UnicodeDammit(im)
print dammit.unicode_markup
#悟缘
print dammit.original_encoding
#utf-8
文档中还有更多功能,比如修改,删除元素,这里就不一一列举。
参考文档
- BeautifulSoup中文文档http://beautifulsoup.readthedocs.org/zh_CN/latest/
- CSS 元素选择器http://www.w3school.com.cn/css/css_selector_type.asp
- lxml官方教程http://lxml.de/tutorial.html