1. Beautiful Soup的简介

简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下:

Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。

Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

2. Beautiful Soup 安装

Beautiful Soup 3 目前已经停止开发,推荐在现在的项目中使用Beautiful Soup 4,不过它已经被移植到BS4了,也就是说导入时我们需要 import bs4 。所以这里我们用的版本是 Beautiful Soup 4.3.2 (简称BS4),另外据说 BS4 对 Python3 的支持不够好,不过我用的是 Python2.7.7,如果有小伙伴用的是 Python3 版本,可以考虑下载 BS3 版本。

可以利用 pip 或者 easy_install 来安装,以下两种方法均可

pip install beautifulsoup

easy_install e beautifulsoup4

如果想安装最新的版本,请直接下载安装包来手动安装,也是十分方便的方法。在这里我安装的是 Beautiful Soup 4.3.2

Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐安装。

解析器

使用方法

优势

劣势

Python标准库

BeautifulSoup(markup, “html.parser”)

Python的内置标准库执

行速度适中

文档容错能力强

Python 2.7.3 or 3.2.2)前的版本中文档容错能力差

lxml HTML 解析器

BeautifulSoup(markup, “lxml”)

速度快

文档容错能力强

需要安装C语言库

lxml XML 解析器

BeautifulSoup(markup, [“lxml”, “xml”])BeautifulSoup(markup, “xml”)

速度快

唯一支持XML的解析器

需要安装C语言库

html5lib

BeautifulSoup(markup, “html5lib”)

最好的容错性以浏览器的方式解析文档生成HTML5格式的文档

速度慢不依赖外部扩展

3. 创建 Beautiful Soup 对象

首先必须要导入 bs4 库

from bs4 import BeautifulSoup

我们创建一个字符串,后面的例子我们便会用它来演示

html = """

The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were

,

Lacie and

Tillie;

and they lived at the bottom of a well.

...

"""

创建 beautifulsoup 对象

soup = BeautifulSoup(html)

另外,我们还可以用本地 HTML 文件来创建对象,例如

soups = BeautifulSoup(open('index.html'))

上面这句代码便是将本地 index.html 文件打开,用它来创建 soup 对象

下面我们来打印一下 soup 对象的内容,格式化输出

print soup.prettify()

The Dormouse's story

以上便是输出结果,格式化打印出了它的内容,这个函数经常用到,小伙伴们要记好咯。

最常用方法

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar

'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

name = soup.find_all('li',class_='element')

print(name)

爬取网页

4. 四大对象种类

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

Tag

NavigableString

BeautifulSoup

Comment

下面我们进行一一介绍

(1)Tag 标签选择器

Tag 是什么?通俗点讲就是 HTML 中的一个个标签,例如

<

The Dormouse's story

Elsie

上面的 title a 等等 HTML 标签加上里面包括的内容就是 Tag,下面我们来感受一下怎样用 Beautiful Soup 来方便地获取 Tags

下面每一段代码中注释部分即为运行结果

print soup.title

#

The Dormouse's story

print soup.head

#

The Dormouse's story

print soup.a

#

print soup.p

#

The Dormouse's story

我们可以利用 soup加标签名轻松地获取这些标签的内容,是不是感觉比正则表达式方便多了?不过有一点是,它查找的是在所有内容中的第一个符合要求的标签,如果要查询所有的标签,我们在后面进行介绍。

我们可以验证一下这些对象的类型

print type(soup.a)

#

获取名称

print soup.name

print soup.head.name

#[document]

#head

soup 对象本身比较特殊,它的 name 即为 [document],对于其他内部标签,输出的值便为标签本身的名称。

获取属性

print soup.p.attrs

#{'class': ['title'], 'name': 'dromouse'}

获取内容

嵌套选择

标准选择器

find_all( name , attrs , recursive , text , **kwargs )

可根据标签名、属性、内容查找文档

name

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar

'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

print(soup.find_all('ul')) #返回的是一个列表

print(type(soup.find_all('ul')[0]))

输出:

[

  • Foo
  • Bar
  • Jay

,

  • Foo
  • Bar

]

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar

'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

for ul in soup.find_all('ul'):

print(ul.find_all('li'))

输出:

[

Foo, Bar, Jay]

[

Foo, Bar]

attrs

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar

'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

print(soup.find_all(attrs={'id': 'list-1'}))

print(soup.find_all(attrs={'name': 'elements'}))

输出:

[

  • Foo
  • Bar
  • Jay

]

[

  • Foo
  • Bar
  • Jay

]

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar

'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

print(soup.find_all(id='list-1'))

print(soup.find_all(class_='element'))

输出:

[

  • Foo
  • Bar
  • Jay

]

[

Foo, Bar, Jay, Foo, Bar]

text

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar

'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

print(soup.find_all(text='Foo'))

输出:

['Foo', 'Foo']

find( name , attrs , recursive , text , **kwargs )

find返回单个元素,find_all返回所有元素

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar

'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

print(soup.find('ul'))

print(type(soup.find('ul')))

print(soup.find('page'))

输出:

  • Foo
  • Bar
  • Jay

None

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar

'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

name = soup.find_all('li',class_='element')

print(name)

输出:

[

Foo, Bar, Jay, Foo, Bar]

find_parents() find_parent()

find_parents()返回所有祖先节点,find_parent()返回直接父节点。

find_next_siblings() find_next_sibling()

find_next_siblings()返回后面所有兄弟节点,find_next_sibling()返回后面第一个兄弟节点。

find_previous_siblings() find_previous_sibling()

find_previous_siblings()返回前面所有兄弟节点,find_previous_sibling()返回前面第一个兄弟节点

find_all_next() find_next()

find_all_next()返回节点后所有符合条件的节点, find_next()返回第一个符合条件的节点

find_all_previous() 和 find_previous()

find_all_previous()返回节点后所有符合条件的节点, find_previous()返回第一个符合条件的节点

CSS选择器

通过select()直接传入CSS选择器即可完成选择

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar

'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

print(soup.select('.panel .panel-heading'))

print("------")

print(soup.select('ul li'))

print("------")

print(soup.select('#list-2 .element'))

print("------")

print(type(soup.select('ul')[0]))

输出:

[

Hello

]

------

[

Foo, Bar, Jay, Foo, Bar]

------

[

Foo, Bar]

------

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar

'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

for ul in soup.select('ul'):

print(ul.select('li'))

输出:

[

Foo, Bar, Jay]

[

Foo, Bar]

获取属性

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar

'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

for ul in soup.select('ul'):

print(ul['id'])

#print(ul.attrs['id'])

输出:

list-1

list-2

获取内容

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar

'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

for li in soup.select('li'):

print(li.get_text())

输出:

Foo

Bar

Jay

Foo

Bar

总结

推荐使用lxml解析库,必要时使用html.parser

标签选择筛选功能弱但是速度快

建议使用find()、find_all() 查询匹配单个结果或者多个结果

如果对CSS选择器熟悉建议使用select()

记住常用的获取属性和文本值的方法

python爬虫select用法_Python爬虫利器二之Beautiful Soup的用法相关推荐

  1. Python 爬虫利器二之 Beautiful Soup 的用法

    上一节我们介绍了正则表达式,它的内容其实还是蛮多的,如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则表达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫 B ...

  2. Python爬虫利器二之Beautiful Soup的用法

    如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,没关系,我们还有一个更强大的工具,叫Beautiful Soup,有了它我们可以很方便地提取出HTML或XML标签中的内容. 1. Beaut ...

  3. python利器怎么用-Python爬虫利器二之Beautiful Soup的用法

    The Dormouse's story Once upon a time there were three little sisters; and their names were , Lacie ...

  4. Python爬虫入门(8):Beautiful Soup的用法

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

  5. 爬虫python需要哪些软件_Python爬虫可以应用在哪些地方

    Python爬虫可以应用在哪些地方 发布时间:2020-06-19 14:46:48 来源:亿速云 阅读:118 作者:元一 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页 ...

  6. python爬虫妹子图_Python 爬虫入门(二)——爬取妹子图

    Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. 公众号:[智能制造社区].欢迎关注,分享智能制造与编程那些事. 爬虫成果 当你运行代码后,文件夹就会 ...

  7. python爬虫面试问题_Python爬虫面试总结

    ## Python爬虫面试总结 1. 写一个邮箱地址的正则表达式? [A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$ 2. 谈 ...

  8. python 正则表达式提取数据_Python爬虫教程-19-数据提取-正则表达式(re)

    本篇主页内容:match的基本使用,search的基本使用,findall,finditer的基本使用,匹配中文,贪婪与非贪婪模式 Python爬虫教程-19-数据提取-正则表达式(re) 正则表达式 ...

  9. python网页爬虫漫画案例_Python爬虫-用Scrapy框架实现漫画的爬取

    14.jpg 在之前一篇抓取漫画图片的文章里,通过实现一个简单的Python程序,遍历所有漫画的url,对请求所返回的html源码进行正则表达式分析,来提取到需要的数据. 本篇文章,通过 scrapy ...

最新文章

  1. 局部邻域搜索-爬山法,模拟退火,禁忌,迭代局部搜索,变邻域局部搜索的简单阐释
  2. 安防工程商必须知道的PoE供电真相
  3. linq语句复杂查询和分开查询的性能对比
  4. 002-layui颜色
  5. java工资高还是php_java和php哪个工资高
  6. c++怎么保留小数位数
  7. 【php】基础学习3
  8. oracle全局索引 效率,关于插入,全局索引和局部索引的情况,那种效率高
  9. WCF学习之旅—WCF概述(四)
  10. 如何安装树莓派鱼眼摄像头模块
  11. 【DL BC】矩阵乘积操作简述
  12. 无刷直流电机学习笔记5
  13. 【001】半电池的开路电压测试_#LIB
  14. matlab方波经过低通滤波,方波滤波matlab的实现
  15. 最新二开微信表情包小程序+前后端 【去授权版】
  16. 阿里云Android直播demo流程
  17. exit code非0什么意思C语言,c++程序出现exit code -1073740940 (0xC0000374)
  18. MySQL的性能优化理论
  19. MongoDB最新最佳连接工具:Robo 3T
  20. Java9中2个被废弃的使用方法

热门文章

  1. 做python开发要用多大的内存卡_编程用surface怎么样发(学python要多大内存)
  2. spring的三种启动方式
  3. 2011 ACM 0和1思想
  4. 认真研究下HTML之id、name、form、submit
  5. java集合类(简介)
  6. 运用基础班知识做一个网页
  7. 源代码 到 可执行程序的过程
  8. 今日心得:人生就像一杯茶,不会苦一辈子但会苦一阵子
  9. (译)C++11中的Move语义和右值引用
  10. 使用FlexBox和Json实现类似ComboBox(类似Google的输入提示和自动)功能-基于JQuery-ASP.NET...