当梦想照进现实

Python BeautifulSoup4安装与简单应用

2015.07.29

BeautifulSoup4官网上的奇怪图片

BeautifulSoup是最初学习Python抓取网页时都会用到的一个库,可以使HTML内容结构化,从而更方便的获取内部数据,可以说是pythoner居家必备的model之一。本文主要对BeautifulSoup的安装与应用作简单的介绍。

注:本文使用的BeautifulSoup版本为BeautifulSoup4

1. BeautifulSoup安装

linux安装

  • 可以通过系统软件包来安装:$ apt-get install Python-bs4
  • 也可以通过easy_installpip安装:$ easy_install beautifulsoup4$ pip install beautifulsoup4

windows安装

  • 可以在官方地址下载源码,然后通过python setup.py install安装;
  • 也可以通过easy_installpip安装,方法同上。

2. 简单浏览结构化数据

使用BeautifulSoup对HTML内容解析之后,HTML内容就变成了结构化数据,可以轻易对其中的DOM元素进行操作,比如获取数据,修改,删除等。
注:由于BeautifulSoup用于采集数据较多,本文只对查找数据做示例。

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其他实用功能

  1. BeautifulSoup默认选用Python标准库html.parser作为解析器,其实可以更改为lxml解析器,速度更快,容错能力也更强;
  2. 所有文字在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
Comments
Write a Comment