Python利用Beautiful Soup模块创建对象详解


Posted in Python onMarch 27, 2017

安装

通过 pip 安装 Beautiful Soup 模块:pip install beautifulsoup4

还可以使用 PyCharm IDE 来写代码,在 PyCharm 中的 Preferences 中找到 Project ,在里面搜索 Beautiful Soup 模块,进行安装即可。

创建 BeautifulSoup 对象

Beautiful Soup 模块广泛使用从网页中得到数据。我们能够使用 Beautiful Soup 模块从 HTML/XML 文档中提取任何数据,例如,网页中的所有链接或者标签内的内容。

为了实现这一点,Beautiful Soup 提供了不同的对象和方法。任何的 HTML/XML 文档能够转化成不同的 Beautiful Soup 对象,这些对象有着不同的属性和方法,我们能够从中提取到需要的数据。

Beautiful Soup 总共有如下三种对象:

  1. BeautifulSoup
  2. Tag
  3. NavigableString

创建 BeautifulSoup 对象

创建一个 BeautifulSoup 对象是任何 Beautiful Soup 工程的起点。

BeautifulSoup 可以通过传一个字符串或者类文件对象(file-like object),例如机器上的文件或者网页。

通过字符串创建 BeautifulSoup 对象

在 BeautifulSoup 的构造器中通过传递一个字符串来创建对象。

helloworld = '<p>Hello World</p>'
soup_string = BeautifulSoup(helloworld)
print soup_string 
<html><body><p>Hello World</p></body></html>

通过类文件对象创建 BeautifulSoup 对象

在 BeautifulSoup 的构造器中通过传递一个类文件对象(file-like object)来创建对象。这在解析在线网页时非常有用。

url = "http://www.glumes.com"
page = urllib2.urlopen(url)
soup = BeautifulSoup(page)
print soup

除了传递类文件对象之外,我们还可以传递本地文件对象到 BeautifulSoup 的构造器来生成对象。

with open('foo.html','r') as foo_file :
 soup_foo = BeautifulSoup(foo_file)
print soup_foo

为 XML 解析创建 BeautifulSoup 对象

Beautiful Soup 模块同样能够用来解析 XML 。

当创建一个 BeautifulSoup 对象时, Beautiful Soup 模块将会选择合适的 TreeBuilder 类来创建 HTML/XML 树。默认情况下,选择 HTML TreeBuilder 对象,它将使用默认的 HTML 解析器,产生一个 HTML 结构树。在上面的代码中,由字符串生成 BeautifulSoup 对象,就是将它解析成了 HTML 树结构。

如果我们想要 Beautiful Soup 模块将输入的内容解析为 XML 类型,那么就需要在 Beautiful Soup 构造器中精确指定使用的 features 参数。通过特定的 features 参数,Beautiful Soup 将会选择最适合的 TreeBuilder 类来满足我们想要的特征。

理解 features 参数

每一个 TreeBuilder 根据它使用的解析器将会有不同的特征。因此,输入的内容根据传递到构造器的 features 参数也会有不同的结果。
在 Beautiful Soup 模块中,TreeBuilder 当前使用的解析器如下:

  1. lxml
  2. html5lib
  3. html.parser

BeautifulSoup 构造器的 features 参数能够接受一个字符串列表或一个字符串值。

当前,每一个 TreeBuilder 支持的 features 参数和解析器如下表所示:

Features TreeBuilder Parser
[‘lxml','html','fast','permissive'] LXMLTreeBuilder lxml
[‘html','html5lib','permissive','strict','html5′] HTML5TreeBuilder html5lib
[‘html','strict','html.parser'] HTMLParserTreeBuilder html.parser
[‘xml','lxml','permissive','fast'] LXMLTreeBuilderForXML lxml

根据指定的 feature 参数,Beautiful Soup 将会选择最合适的 TreeBuilder 类。如果在指定对应的解析器时,出现如下的报错信息,可能就是需要安装对应的解析器了。

bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. 
Do you need to install a parser library?

就 HTML 文档而言,选择 TreeBuilder 的顺序是基于解析器建立的优先级,就如上表格所示的优先级。首先是 lxml ,其次是 html5lib ,最后才是 html.parser 。例如,我们选择 html 字符串作为 feature 参数,那么如果 lxml 解析器可用,则 Beautiful Soup 模块将会选择 LXMLTreeBuilder 。如果 lxml 不可用,则会选择 根据 html5lib 解析器选择 HTML5TreeBuilder 。如果在不可用,则会选择根据 html.parser 选择 HTMLParserTreeBuilder 了。

至于 XML ,由于 lxml 是唯一的解析器,所以 LXMLTreeBuilderForXML 总是会被选择的。

所以,为 XML 创建一个 Beautiful Soup 对象的代码如下:

helloworld = '<p>Hello World</p>'
soup_string = BeautifulSoup(helloworld,features="xml")
print soup_string

输入的结果也是 XML 形式的文件 :

在创建 Beautiful Soup 对象时,更好的实践是指定解析器。这是因为,不同的解析器解析的结果内容大不相同,尤其是在我们的 HTML 文档内容非法时,结果更为明显。

当我们创建一个 BeautifulSoup 对象时,Tag 和 NavigableString 对象也就创建了。

创建 Tag 对象

我们可以从 BeautifulSoup 对象中得到 Tag 对象,也就是 HTML/XML 中的标签。

如下 HTML 代码所示:

#!/usr/bin/python
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
html_atag = """
 <html>
 <body>
 <p>Test html a tag example</p>
 <a href="http://www.glumes.com'>Home</a>
 <a href="http;//www.glumes.com/index.html'>Blog</a>
 </body>
 <html>
 """
soup = BeautifulSoup(html_atag,'html.parser')
atag = soup.a
print type(atag)
print atag

从结果中可以看到 atag 的类型是 <class 'bs4.element.Tag'>  。而 soup.a 的结果就是 HTML 文档中的第一个 <a> 标签。
HTML/XML 标签对象具有名称和属性。名称就是标签的名字,例如 标签 <a> 的名称就是 a 。属性则是标签的 class 、id 、style 等。Tag 对象允许我们得到 HTML 标签的名称和属性 。

Tag 对象的名称

通过 .name 方式得到 Tag 对象的名称 。

tagname = atag.name
print tagname

同时也能够改变 Tag 对象的名称:

atag.name = 'p'

这样就将上面 HTML 文档中的第一个 <a> 标签名称换成了 <p> 标签了。

Tag 对象的属性

在 HTML 页面中,标签可能有不同的属性,例如 class 、id 、style 等。Tag 对象能够以字典的形式访问标签的属性。

atag = soup_atag.a
print atag

也能通过 .attrs 的方式访问到,这样会将所有的属性内容都打印出来 :

print atag.attrs
{'href': u'http://www.glumes.com'}

创建 NavigableString 对象

NavigableString 对象持有 HTML 或 XML 标签的文本内容。这是一个 Unicode 编码的字符串。

我们可以通过 .string 的方式得到标签的本文内容 。

navi = atag.string
print type(navi)
print navi.string

小结

代码小结如下:

BeautifulSoup

  • soup = BeautifulSoup(String)
  • soup = BeautifulSoup(String,features=”xml”)

Tag

  • tag = soup.tag
  • tag.name
  • tag[‘attribute']

NavigableString

  • soup.tag.string

总结

以上就是关于Python使用Beautiful Soup模块创建对象的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
Python操作CouchDB数据库简单示例
Mar 10 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
Jun 18 Python
pandas中Timestamp类用法详解
Dec 11 Python
对numpy和pandas中数组的合并和拆分详解
Apr 11 Python
学习python的前途 python挣钱
Feb 27 Python
详解小白之KMP算法及python实现
Apr 04 Python
opencv3/C++图像像素操作详解
Dec 10 Python
Python中Flask-RESTful编写API接口(小白入门)
Dec 11 Python
使用pytorch实现可视化中间层的结果
Dec 30 Python
keras实现多种分类网络的方式
Jun 11 Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 Python
Python列表的深复制和浅复制示例详解
Feb 12 Python
Python利用Beautiful Soup模块修改内容方法示例
Mar 27 #Python
python递归查询菜单并转换成json实例
Mar 27 #Python
Python中的命令行参数解析工具之docopt详解
Mar 27 #Python
Python使用PDFMiner解析PDF代码实例
Mar 27 #Python
详解python并发获取snmp信息及性能测试
Mar 27 #Python
使用Python写CUDA程序的方法
Mar 27 #Python
pyenv命令管理多个Python版本
Mar 26 #Python
You might like
我的论坛源代码(二)
2006/10/09 PHP
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
在smarty中调用php内置函数的方法
2013/02/07 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
2015/03/19 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
2015/12/21 PHP
php获取给定日期相差天数的方法分析
2017/02/20 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
2016/05/17 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
2016/06/09 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
那些精彩的JavaScript代码片段
2017/01/12 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
2018/08/01 Javascript
Koa 中的错误处理解析
2019/04/09 Javascript
vue resource发送请求的几种方式
2019/09/30 Javascript
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
Python中%r和%s的详解及区别
2017/03/16 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
护士思想汇报
2014/01/12 职场文书
房屋买卖委托公证书
2014/04/08 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
老公给老婆的检讨书(精华篇)
2014/10/18 职场文书
python实战之一步一步教你绘制小猪佩奇
2021/04/22 Python
Navicat for MySQL的使用教程详解
2021/05/27 MySQL