Python爬虫(4):Beautiful Soup的常用方法
2018-03-28 10:23
453 查看
Requests库的用法大家肯定已经熟练掌握了,但是当我们使用
Requests获取到网页的 HTML 代码信息后,我们要怎样才能抓取到我们想要的信息呢?我相信大家肯定尝试过很多办法,比如字符串的 find 方法,还有高级点的正则表达式。虽然正则可以匹配到我们需要的信息,但是我相信大家在匹配某个字符串一次一次尝试着正则匹配的规则时,一定很郁闷。
那么,我们就会想有没有方便点的工具呢。答案是肯定的,我们还有一个强大的工具,叫
BeautifulSoup。有了它我们可以很方便地提取出
HTML或
XML标签中的内容,这篇文章就让我们了解下
BeautifulSoup的常用方法吧。
什么是BeautifulSoup?
Python的网页解析可以用正则表达式去完成,那么我们在写的时候,要挨个的去把代码拿出来匹配,而且还要写匹配的规则,整体实现起来就很复杂。
BeautifulSoup呢,它是一个方便的网页解析库,处理高效,支持多种解析器。大部分情况下,利用它我们不在需要编写正则表达式就可以方便的实现网页信息的提取。
官方文档
安装:
$ pip install beautifulsoup4
BeautifulSoup是一个网页解析库,它支持很多解析器,不过最主流的有两个。一个是
Python标准库,一个是
lxmlHTML 解析器。两者的使用方法相似:
Python内置标准库的执行速度一般,但是低版本的
Python中,中文的容错能力比较差。
lxmlHTML 解析器的执行速度快,但是需要安装 C语言的依赖库。
lxml的安装
由于lxml安装需要依赖C语言库,所以当
lxml在
Windows上安装时,我们会发现各种奇怪的报错,当然脸好的使用
pip install lxml
安装也是可以成功的。不过大部分人都是会倒在这里。
这里推荐大家使用
lxml的
.whl文件来安装。首先我们需要安装一下
wheel库,有了这个库我们才可以正常安装
.whl文件。
pip install wheel
从官方网站下载与系统,
Python版本匹配的lxml文件:地址。
另外,不知道自己系统和
python版本信息的伙伴。需要进入系统管理员工具(CMD)或者python的 IDLE,输入以下代码:
Python版本信息了。
下载好
lxml的文件后,我们需要找到文件的位置,然后进入管理员工具,使用
pip安装:
pip install whl文件的全名
安装完成后,可以进入
Python,
import一下,如果没有报错,那么恭喜你安装成功。
如果有的伙伴觉得麻烦,那我推荐大家安装
anaconda<
11cdb
/code> 下载地址(如果安装速度慢,可以找国内镜像),不知道是什么的小伙伴可以谷歌一下,有了他,那些在windows
上pip安装出错的问题将不再存在。
BeautifulSoup的基本标签选择方法
虽然Python内置的标准库解析器还不错,但是我还是推荐大家使用
lxml,因为它够快。那么后面的代码我们都是用
lxml解析器来进行演示。
我们先导入官方文档的例子:
BeautifulSoup的对象,并能按照标准的缩进格式的结构输出:
prettify()方法来进行自动补全,注释部分就是运行的输出:
获取标签
title标签。
获取名称
获取属性
attrs方法,传给他属性名,就可以得到标签的属性。通过结果我们可以看到,直接传给p标签属性名,一样可以获取到标签属性。
获取内容
常见用法
标准选择器
虽然BeautifulSoup的基本用法,标签获取,内容获取,可以解析一些 html代码。但是在遇到很多复杂的页面时,上面的方法是完全不足的,或者是很繁琐的,因为有时候有的标签会有几个属性(class、id等)。
索性
BeautifulSoup给我们提供了很方便的标准选择器,也就是 API 方法,这里着重介绍2个:
find()和
find_all()。其它方法的参数和用法类似,大家举一反三吧。
find_all()
find_all(name, attrs, recursive, text, **kwargs)可以根据标签,属性,内容查找文档。
find_all()其实和正则表达式的原理很相似,他能找出所有能满足匹配模式的结果,在把结果以列表的形式返回。
仍然是文档的例子:
过滤器
文档参考介绍
find_all()方法前,大家可以参考一下过滤器的类型。过滤器只能作为搜索文档的参数,或者说应该叫参数类型更为贴切。这些过滤器贯穿整个搜索的API。过滤器可以被用在 tag 的
name中,节点的属性中,字符串中或他们的混合中。
find_all()方法搜索当前 tag 的所有 tag 子节点,并判断是否符合过滤器的条件。这里有几个例子:
string和
id是什么含义? 为什么
find_all("p", "title")返回的是CSS Class为”title”的标签? 我们来仔细看一下
find_all()的参数:
name参数
name 参数可以查找所有名字为 name 的 tag,字符串对象会被自动忽略掉。True。
我们常用的 name 参数是搜索文档的标签名。
keyword参数
如果我们的 HTML代码中有几个div标签,但是我们只想获取到
class属性为
top的
div标签,我们怎么出来呢。
id为
link2的
a标签。
limit参数
find_all()方法返回全部的搜索结构,如果文档树很大那么搜索会很慢。如果我们不需要全部结果,可以使用
limit参数限制返回结果的数量。效果与 SQL 中的
limit关键字类似,当搜索到的结果数量达到
limit的限制时,就停止搜索返回结果。
比如我们要搜索出
a标签,但是满足的有3个,我们只想要得到2个:
find()
find_all()返回的是所有元素列表,
find()返回单个元素。
find( name , attrs , recursive , string , **kwargs )
find_all()方法将返回文档中符合条件的所有 tag,尽管有时候我们只想得到一个结果。比如文档中只有一个标签,那么使用
find_all()方法来查找标签就不太合适, 使用
find_all方法并设置
limit=1参数不如直接使用
find()方法。下面两行代码是等价的:
find_all()方法的返回结果是值包含一个元素的列表,而
find()方法直接返回结果。
find_all()方法没有找到目标是返回空列表,
find()方法找不到目标时,返回
None。
CSS选择器
Beautiful Soup支持大部分的 CSS选择器。在
Tag或
BeautifulSoup对象的
.select()方法中传入字符串参数, 即可使用 CSS选择器的语法找到 tag。我们在写 css 时,标签 class类名加”
.“,id属性加”
#“。
提取标签内容
如果我们得到了几个标签:总结
BeautifulSoup的解析库,推荐使用
lxml,如果出现乱码的情况下,可以使用
html.parser;
BeautifulSoup的标签选择筛选方法,虽然弱但是速度快;
推荐使用
find_all(),
find()方法搜索标签,当然如果对css选择器熟悉,推荐使用
.select()方法;
get_text()方法获取标签文本内容,
get[attrs]方法获取标签属性值。
本篇我们就基本上整理了
BeautifulSoup的常用方法。如果大家希望了解更高级的用法,可以查看
BeautifulSoup的官方文档。
最后,大家可以结合
Requests库写出自己的爬虫吧。
谢谢阅读
原文地址:https://www.yukunweb.com/2017/6/python-spider-BeautifulSoup-basic/
相关文章推荐
- Python爬虫正则表达式常用符号和方法
- Python爬虫简单常用方法
- Python爬虫正则表达式常用符号和方法
- python爬虫之urllib库常用方法用法总结大全
- python中常用的九种预处理方法分享
- Python3读取文件常用方法实例分析
- python类常用的内置方法
- Python 随机数常用方法
- python中字符串(str)的常用处理方法
- python os.path模块常用方法详解
- python语法——变量,字符串常用方法,数字
- 【Python爬虫学习笔记(3)】Beautiful Soup库相关知识点总结
- python一些常用方法和命令
- python爬虫之scrapy中user agent浅谈(两种方法)
- [python] 类常用的内置方法
- 玩转python爬虫之cookie使用方法
- Python爬虫实践(四):一些不常用设置
- Python 爬虫 URL中存在中文或特殊符号无法请求的解决方法
- 18_Python列表常用方法总结
- Python 字典 元祖 链表 常用方法 及概念区别