Beautiful Soup模块完整解析(上)

本文详述了Python的BeautifulSoup模块,涵盖了安装配置、对象类型(Tag、NavigableString、BeautifulSoup、Comment)、遍历文档树(子节点、父节点、兄弟节点及回退前进)以及搜索文档树的各种方法。文章通过实例介绍了如何查找、遍历和操作HTML文档,是学习BeautifulSoup的入门指南。
摘要由CSDN通过智能技术生成

Beautiful Soup模块完整解析(上)

标签(空格分隔): Python Packages crawler


最近在研究python爬虫,整理了一些BeautifulSoup包的内容。
文档上篇整理了官方说明文档中的内容,简单介绍包的安装与调用、格式化后文档树的结构、遍历文档树以及搜索文档树的方式,最后会给出一个从豆瓣中抓取影单的例子。

1 Beautiful Soup

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。

1.1 安装与基础配置

如果电脑中已经安装了pip包,那么直接在cmd窗口中输入:

pip install pip install beautifulsoup4

如果没有安装pip包,可以下载BS4的源码,然后通过setup.py来安装。即,在目录下右键打开cmd窗口,输入:

Python setup.py install

BS4的开发是在python2.7和python3.2的环境中开发的,因此本文中的命令在python2与python3中是通用的。BeautifulSoup发布时候打包成为Python2版本的代码,在Python3环境下安装时,会自动转换成Python3的代码,如果没有安装过程,那么代码就不会被转换。

如果代码抛出了 ImportError 的异常: “No module named HTMLParser”, 这是因为你在Python3版本中执行Python2版本的代码.

如果代码抛出了 ImportError 的异常: “No module named html.parser”, 这是因为你在Python2版本中执行Python3版本的代码.

解决以上问题最简单的办法就是重新安装2333

如果在ROOT_TAG_NAME = u’[document]’代码处遇到 SyntaxError “Invalid syntax”错误,需要将把BS4的Python代码版本从Python2转换到Python3. 可以重新安装BS4:

Python3 setup.py install

或者在bs4的目录中执行Python代码版本转换脚本:

2to3-3.2 -w bs4

BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是lxml。lxml的同样可以使用pip进行安装。

另一个可供选择的解析其实纯Python实现的html5lib,它的结息方式与浏览器相同,安装方法与lxml相同。如果使用的是Anaconda的整体包,那么以上包应该都是包含在内的。

不同解析器之间的区别会在以后的文章中介绍。

一般情况下,推荐使用lxml解析器,其效率更高。

1.2 基本操作

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc)  #此处的html_doc是通过request 得到的网站响应
print(soup.prettify())  #可以得到一个整理规范的标准HTML文档

这段代码逻辑如下:首先导入BeautifulSoup包。然后通过构造方法调用一个文档对象。构造方法中可以传入一段字符串或者一个文件句柄。首先,文档被转换为Unicode格式,并且HTML的实力都被转换为Unicode编码。
然后BeautifulSoup会选择最合适的解析器来解析文档。同样,也可以手动指定解析器,格式如下:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc,"lxml")
print(soup.prettify())

得到的是一个规范化的HTML文档。
接下来将介绍这个HTML文档包含的元素类别和属性。

2. 对象的种类

Beautiful Soup将复杂的HTMl文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为四种TagNavigableStringBeautifulSoupComment
接下来分别介绍这四种对象。

2.1 Tag

Tag与HTML原生文档中的tag相同

soup = BeautifulSoup(' <b class="boldest">Extremely bold</b><b class = "boldest> Extremly bold bold</b>')
tag = soup.b
type(tag)   #<class 'bs4.element.Tag'>

上述代码中,首先使用构造一个BeautifulSoup对象;然后通过soup.b选取第一个name为b的Tag;可以看到,tag的类型为Tag。
Tag有很多属性,在遍历文档树和搜索文档树中都有介绍
Tag的重要属性:nameattributes

2.1.1 Name

每个Tag都有自己的名字,通过.name来获取:

tag.name
# u'b'

如果改变了Tag的Name,那么将影响HTML文档中所有该Tag的属性。

tag.name = "blockquote"
print(soup)
# <blockquote class="boldest">Extremely bold</blockquote>
<b class = "boldest> Extremly bold bold</b>
2.1.2 Attributes

一个tag可能有多个属性,在上面给出的例子中,有一个”class”属性,值为”blodest”,对于.tag的操作类似于字典:

tag['class']
# u'blodest'

也可以直接用.attrs:

tag.attrs
# {u'class': u'boldest'}

Tag属性可以添加、删除或者修改,如同字典一样:

tag['class'] = 'verybold'
tag['id'] = 1
tag
# <blockquote class="verybold" id="1">Extremely bold</blockquote>

del tag['class']
del tag['id']
tag
# <blockquote>Extremely bold</blockquote>

tag['class']
# KeyError: 'class'
print(tag.get('class'))
# None
2.1.3 多值属性

HTML4定义了一系列可以包含多个值得属性。在HTML5中溢出了一些,却增加的更多,最常见的多值属性是class(一个tag可以由多个CSS的class)。还有一些属性rel,rev,accept-charset,headers,accesskey。

css_soup = BeautifulSoup('<p class="body strikeout"></p>')
css_soup.p['class']
# ["body", "strikeout"]
css_soup.p.attrs
# {'class': ['body', 'strikeout']}

css_soup = BeautifulSoup('<p class="body"></p>')
css_soup.p['class']
# ["body"]

如果某个属性看起来好像有多个值,但在任何版本的HTML中都没有被定义为为多值属性,那么BeautifulSoup会将这个属性作为字符串返回。

id_soup = BeautifulSoup('<p id="my id"></p>')
id_soup.p['id']
# 'my id'

将Tag转换为字符串时,多值属性会合并为一个值:

rel_soup = BeautifulSoup('<p>Back to the <a rel="index">homepage</a></p>')
rel_soup.a['rel']
# ['index']
rel_soup.a['rel'] = ['index', 'contents']
print(rel_soup.p)
# <p>Back to the <a rel="index contents">homepage</a></p>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值