http://blog.csdn.net/kikaylee/article/details/56841789

’BeautifulSoup是Python的一个库,最主要的功能就是从网页爬取我们需要的数据。BeautifulSoup将html解析为对象进行处理,全部页面转变为字典或者数组,相对于正则表达式的方式,可以大大简化处理过程。

0x01 安装

建议安装BeautifulSoup 4版本 利用pip进行安装:

  1. pip install beautifulsoup4
  • 1

BeautifulSoup默认支持Python的标准HTML解析库,但是它也支持一些第三方的解析库:

序号 解析库 使用方法 优势 劣势
1 Python标准库 BeautifulSoup(html,’html.parser’) Python内置标准库;执行速度快 容错能力较差
2 lxml HTML解析库 BeautifulSoup(html,’lxml’) 速度快;容错能力强 需要安装,需要C语言库
3 lxml XML解析库 BeautifulSoup(html,[‘lxml’,’xml’]) 速度快;容错能力强;支持XML格式 需要C语言库
4 htm5lib解析库 BeautifulSoup(html,’htm5llib’) 以浏览器方式解析,最好的容错性 速度慢

0x02 创建对象

导入库:

  1. from bs4 import BeautifulSoup
  • 1

创建实例:

  1. url='http://www.baidu.com'
  2. resp=urllib2.urlopen(url)
  3. html=resp.read()
  • 1
  • 2
  • 3

创建对象:


  1. bs=BeautifulSoup(html)
  • 1
  • 2

格式化输出内容:

  1. print bs.prettify()
  • 1

0x03 对象种类

BeautifulSoup将复杂的html文档转换为树形结构,每一个节点都是一个对象,这些对象可以归纳为几种:

(1)Tag

Tag相当于html种的一个标签:

  1. #提取Tag
  2. print bs.title
  3. print type(bs.title)
  • 1
  • 2
  • 3

结果:

  1. <title>百度一下,你就知道</title>
  2. <class 'bs4.element.Tag'>
  • 1
  • 2

对于Tag,有几个重要的属性:

name:每个Tag对象的name就是标签本省的名称; 
attrs:每个Tag对象的attrs就是一个字典,包含了标签的全部属性。

  1. print bs.a.name
  2. print bs.a.attrs
  • 1
  • 2

输出:

  1. a
  2. {u'href': u'/', u'id': u'result_logo', u'onmousedown': u"return c({'fm':'tab','tab':'logo'})"}
  • 1
  • 2

(2)NavigableString

Comment是一种特殊的NavigableString,对应的是注释的内容,但是其输出不包含注释符。看这样的一个例子:

  1. #coding:utf-8
  2. from bs4 import BeautifulSoup
  3. html='''
  4. <a class="css" href="http://example.com/test" id="test"><!--test --></a>
  5. '''
  6. bs=BeautifulSoup(html,"html.parser")
  7. print bs.a
  8. print bs.a.string
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

运行结果:

  1. <a class="css" href="http://example.com/test" id="test"><!--def --></a>
  • 1

a标签的内容是注释,但是使用.string仍然输出了。这种情况下,我们需要做下判断:

  1. #判断是否是注释
  2. if type(bs.a.string)==element.Comment:
  3. print bs.a.string
  • 1
  • 2
  • 3

再看下面的例子:

  1. <a class="css1" href="http://example.com/cdd" id="css">abc<!--def -->gh</a>
  • 1

内容是注释和字符串混合,此时可以用contents获取全部对象:

  1. for i in bs.a.contents:
  2. print i
  • 1
  • 2

如果需要忽略注释内容的话,可以利用get_text()或者.text:

  1. print bs.a.get_text()
  • 1

如果想在BeautifulSoup之外使用 NavigableString 对象,需要调用unicode()方法,将该对象转换成普通的Unicode字符串,否则就算BeautifulSoup已方法已经执行结束,该对象的输出也会带有对象的引用地址,这样会浪费内存。

0x04 搜索文档树

重点介绍下find_all()方法:

  1. find_all( name , attrs , recursive , text , **kwargs )
  • 1

(1)name参数

name参数可以查找所有名字为name的Tag,字符串对象自动忽略掉。

  1. print bs.find_all('a')
  • 1

传列表:

  1. print bs.find_all(['a','b'])
  • 1

传入正则表达式:

  1. print bs.find_all(re.compile('^b'))
  • 1

所有以b开头的标签对象都会被找到。 
传递方法:

  1. def has_class_but_not_id(tag):
  2. return tag.has_attr('class') and not tag.has_attr('id')
  3. print bs.find_all(has_class_but_not_id)
  • 1
  • 2
  • 3

(2)kwyowrds关键字

  1. print bs.find_all(id='css')
  2. print bs.find_all(id=re.compile('^a'))
  • 1
  • 2

还可以混合使用:

  1. print bs.find_all(id='css',href=re.compile('^ex'))
  • 1

可以使用class作为过滤,但是class是Python中的关键字,可以使用class_代替,或者采用字典的形式传输参数:

  1. print bs.find_all(class_='css')
  2. print bs.find_all(attrs={'class':'css'})
  • 1
  • 2

(3)text参数

用来搜索文档中的字符串内容,text参数也接收字符串、正则表达式、列表、True等参数。

  1. print bs.find_all(text=re.compile('^abc'))
  • 1

(4)limit参数

限制返回对象的个数,与数据库SQL查询类似。

(5)recursive参数

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

0x05 CSS选择器

可以采用CSS的语法格式来筛选元素:

  1. #标签选择器
  2. print bs.select('a')
  3. #类名选择器
  4. print bs.select('.css')
  5. #id选择器
  6. print bs.select('#css')
  7. #属性选择器
  8. print bs.select('a[class="css"]')
  9. #遍历
  10. for tag in bs.select('a'):
  11. print tag.get_text()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

对于喜欢用CSS语法的人来说,这种方式非常方便。如果你仅仅需要CSS选择器的功能,那么直接使用 lxml 也可以,而且速度更快,支持更多的CSS选择器语法,但Beautiful Soup整合了CSS选择器的语法和自身方便使用API。

BeautifulSoup基本步骤的更多相关文章

  1. from bs4 import BeautifulSoup 引入需要安装的文件和步骤

    调用beautifulsoup库时,运行后提示错误: ImportError: No module named bs4 , 意思就是没有找到bs4模块,所以解决方法就是将bs4安装上,具体步骤如下: ...

  2. python+urllib+beautifulSoup实现一个简单的爬虫

    urllib是python3.x中提供的一系列操作的URL的库,它可以轻松的模拟用户使用浏览器访问网页. Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能 ...

  3. BeautifulSoup获取指定class样式的div

    如何获取指定的标签的内容是解析网页爬取数据的必要手段,比如想获取<div class='xxx'> ...<div>这样的div标签,通常有三种办法, 1)用字符串查找方法,然 ...

  4. Ubuntu上如何安装Java,Eclipse,Pydev,Python(自带,不用装),BeautifulSoup

    如何安装Java,如果出于编程的需要安装Java,需要安装的是JDK,而不仅仅是JRE,下面说说如何在Ubuntu下如何安装JDK:只有两步,1.下载并解压,2.配置环境变量1.下载并解压:下载地址: ...

  5. Python安装BeautifulSoup库(Windows平台下)

    简介 参照官网Beautiful Soup4.4.0文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/ 安装步骤 1.到https:// ...

  6. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  7. 使用BeautifulSoup和正则表达式爬取时光网不同地区top100电影并使用Matplotlib对比

    还有一年多就要毕业了,不准备考研的我要着手准备找实习及工作了,所以一直没有更新. 因为Python是自学不久,发现很久不用的话以前学过的很多方法就忘了,今天打算使用简单的BeautifulSoup和一 ...

  8. from bs4 import BeautifulSoup 报错

    一: BeautifulSoup的安装: 下载地址:https://www.crummy.com/software/BeautifulSoup/bs4/download/4.6/ 下载后,解压缩,然后 ...

  9. Python爬虫html解析工具beautifulSoup在pycharm中安装及失败的解决办法

    1.安装步骤: 首先,你要先进入pycharm的Project Interpreter界面,进入方法是:setting(ctrl+alt+s) ->Project Interpreter,Pro ...

随机推荐

  1. Django之 Model Field Options

    以下这些选项都是可选择的,非固定要求. 1)null,注意在CharField或者TextField里避免使用null,因为其存储的值是空字符串而不是NULL 2)blank该字段是否可以为空.如果为 ...

  2. WP runtime local setting

    https://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.applicationdata.localsettings. ...

  3. CSS选择器学习小结

    关于CSS选择器的问题,在实际项目中,以及一般的前端面试中会经常遇到.下面对此做一小结,梳理和巩固相关方面知识.(如有不妥之处,还望大家及时批评指正,以免误导他人) 一.选择器种类 1.id选择器(# ...

  4. inline和inline-block的间隙问题

    我们在前端布局的时候,会偶尔发现,在具有inline/inline-block属性的元素间存在一小段间隙,网上有些文章说这个间隙是6px,但我觉得应该是一个空格的宽度. 这里以inline-block ...

  5. hibernate自带的注解和jpa注解的冠希

    hibernate是实现了JPA规范,在我们使用hibernate框架的时候,我们引入了hibernate3或者4这个核心包.hibernate-jpa-2.0-api-1.0.0.Final.jar ...

  6. Haskell语言学习笔记(43)Parsec(2)

    组合子 1 Prelude Text.Parsec Text.Parsec.String> parseTest (count 3 (char 'a')) "aaa" &quo ...

  7. 最短路径-Dijkstra算法(转载)

    注意:以下代码 只是描述思路,没有测试过!! Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始 ...

  8. linux 下 安装nginx及压力测试

    linux 编译安装nginx,配置自启动脚本 下载nginx: wget http://nginx.org/download/nginx-1.8.0.tar.gz下载openssl : wget h ...

  9. bat cmd dos 通过拖拽参数 上传 截取拖拽上传文件名

    echo off setlocal enabledelayedexpansion :: L 小写 for /l %%i in (1,1,10000) do ( :con set /p a= selec ...

  10. mysql优化连接数

    很多开发人员都会遇见”MySQL: ERROR 1040: Too many connections”的异常情况,造成这种情况的一种原因是访问量过高,MySQL服务器抗不住,这个时候就要考虑增加从服务 ...