Beautiful Soup:让爬虫变得更beautiful

Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库,在熟练掌握后,它能帮你很轻松的实现文档中某一内容的查找定位。

一.bs4模块的安装和Beautiful Soup的引用

bs4模块不是系统自带的,个人喜欢用pip下载方便又快捷,打开电脑的命令行窗口,输入:

1
pip install bs4

即可,在下载好bs4模块后,我们想调用里面的Beautful Soup,只需要在开头加上:

1
from bs4 import BeautifulSoup

注:BeautifulSoup不仅支持HTML解析器,还支持lxml,html5lib等第三方的解析器,但这些解析器需要另外下载,下表是BeautfulSoup中文文档对其他一些解析器的介绍,本文之后的内容仅采用最基本的HTML解析器,其他的请大家自行上网查找资料,本文不做过多介绍:

解析器 使用方法 优势 劣势
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格式的文档 速度慢不依赖外

二.BeautifulSoup的正确打开方式

我们既然都把BeautifulSoup从模块里单独引用出来了,说明其一定有着非常重要的作用,我们得到一段HTML文本,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

我们在用尽各种手段得到这段文本后,首先要对它进行解析:

1
page=BeautifulSoup(html_doc,"html.parser",from_encoding='utf-8')

想要创建一个BeautifulSoup对象,需要三个参数,第一个是待解析的HTML文本,第二个是解析器类型,第三个是HTML文本的编码类型。它将HTNL文档转化为一棵标签树,所有的节点可分为以下几类

基本元素 说明
Tag 标签,最基本的信息组织单位,分别用<>和标明开头和结尾
Name 标签的名字,

..

的名字是 p,格式:.name
Attributes 标签的属性,字典形式组成,格式:.attrs
NavigableString 标签内非属性字符串, <>...中字符串,格式:.string
Comment 标签内字符串的注释部分,一种特殊的comment类型

操作这棵标签树的最简单的办法是使用tag_name,用法tag.tag_name,例如:

1
2
3
4
page.head
# '''<head><title>The Dormouse's story</title></head>'''
page.a
# '''<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>'''

但用此方法只能找到第一个标签,想要找到之后的标签以及全部的标签,就需要用到爬虫中很常用的BeautifulSoup类的两个函数。

三.find和find_all

(一) find函数

find函数之返回第一个匹配的对象,基本语法为:

1
find(tag, attributes, recursive, text, keywords)

我们在平常一般只用前2个参数:tag,attributes。

tag

需要搜素的标签名

attributes
属性参数 attributes 是用一个 Python 字典封装一个标签的若干属性和对应的属性值。例如

1
2
page.find('a',{"id":"link1"})返回
'''<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>'''

recursive

递归参数recursive是一个布尔变量,如果recursive设置为True,调用该函数会从所有层级的标签中查找出符合要求的,而如果设置为False,就只会从一级标签中查找, recursive 默认值是 True ,一般不需要设置。

text
文本参数 text 有点不同,它是用标签的文本内容去匹配,而不是用标签的属性。

keywords
可以让你选择那些具有指定属性的标签,其实和用attributes传参基本一致

1
2
3
4
#用keyword
page.find('a',id="link1")
#用attributes
page.find('a',{"id":"link1"})

在写属性名时,如果属性名和python的保留关键字相同,会出现报错的情况,如class,这时候我们有两种办法解决:

  • 在attrs属性用字典的方式进行参数传递
  • BeautifulSoup自带的特别关键字class_

(二).find_all函数

与find不同,find_all返回所有匹配到的结果,并将匹配结果打包成列表的形式返回。基本语法:

1
find_all(tag, attributes, recursive, text, limit, keywords)

基本与find相同,只是多了一个limit参数

limit

范围限制参数 limit ,显然只用于 find_all 方法。 find 其实等价于 find_all 的 limit 等于1 时的情形。如果你只对网页中获取的前 x 项结果感兴趣,就可以设置它.

四.获得你想要的值

我们在通过find和find_all方法找到了你想要找的标签后,该如何获得标签内你想要的某个属性值或者是文本呢?这里我们介绍两个方法get和get_text,例如我们定位到了标签tag=<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,我们想要获取其href属性的地址,只需要

1
tag.get("href") #参数为属性名

如果我们需要的是标签的文本值Elsie,只需要

1
tag.get_text()

怎么样是不是很简单呢?

关于BeautifulSoup我就介绍这么多啦,感谢各位观看!!

End~~ 撒花ฅ>ω<*ฅ花撒