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 | html_doc = """ |
我们在用尽各种手段得到这段文本后,首先要对它进行解析:
1 | page=BeautifulSoup(html_doc,"html.parser",from_encoding='utf-8') |
想要创建一个BeautifulSoup对象,需要三个参数,第一个是待解析的HTML文本,第二个是解析器类型,第三个是HTML文本的编码类型。它将HTNL文档转化为一棵标签树,所有的节点可分为以下几类
基本元素 | 说明 |
---|---|
Tag | 标签,最基本的信息组织单位,分别用<>和>标明开头和结尾 |
Name | 标签的名字, .. 的名字是 p,格式: |
Attributes | 标签的属性,字典形式组成,格式: |
NavigableString | 标签内非属性字符串, <>...>中字符串,格式: |
Comment | 标签内字符串的注释部分,一种特殊的comment类型 |
操作这棵标签树的最简单的办法是使用tag_name,用法tag.tag_name
,例如:
1 | page.head |
但用此方法只能找到第一个标签,想要找到之后的标签以及全部的标签,就需要用到爬虫中很常用的BeautifulSoup类的两个函数。
三.find和find_all
(一) find函数
find函数之返回第一个匹配的对象,基本语法为:
1 | find(tag, attributes, recursive, text, keywords) |
我们在平常一般只用前2个参数:tag,attributes。
tag
需要搜素的标签名
attributes
属性参数 attributes 是用一个 Python 字典封装一个标签的若干属性和对应的属性值。例如
1 | page.find('a',{"id":"link1"})返回 |
recursive
递归参数recursive是一个布尔变量,如果recursive设置为True,调用该函数会从所有层级的标签中查找出符合要求的,而如果设置为False,就只会从一级标签中查找, recursive 默认值是 True ,一般不需要设置。
text
文本参数 text 有点不同,它是用标签的文本内容去匹配,而不是用标签的属性。
keywords
可以让你选择那些具有指定属性的标签,其实和用attributes传参基本一致
1 | #用keyword |
在写属性名时,如果属性名和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我就介绍这么多啦,感谢各位观看!!