Beautiful Soup模块完整解析(上)
标签(空格分隔): Python Packages crawler
最近在研究python爬虫,整理了一些BeautifulSoup包的内容。
文档上篇整理了官方说明文档中的内容,简单介绍包的安装与调用、格式化后文档树的结构、遍历文档树以及搜索文档树的方式,最后会给出一个从豆瓣中抓取影单的例子。
- 1 Beautiful Soup简介
- 2 对象的种类
- 3. 遍历文档树
- 4. 搜索文档树
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对象,所有对象可以归纳为四种Tag、NavigableString、BeautifulSoup、Comment。
接下来分别介绍这四种对象。
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的重要属性:name、attributes
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>

本文详述了Python的BeautifulSoup模块,涵盖了安装配置、对象类型(Tag、NavigableString、BeautifulSoup、Comment)、遍历文档树(子节点、父节点、兄弟节点及回退前进)以及搜索文档树的各种方法。文章通过实例介绍了如何查找、遍历和操作HTML文档,是学习BeautifulSoup的入门指南。
最低0.47元/天 解锁文章
702

被折叠的 条评论
为什么被折叠?



