1、Beautiful Soup 420 文档Beautiful Soup 4.2.0 文档Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.这篇文档介绍了BeautifulSoup4中所有主要特性,并切有小例子.让我来向你展示它适合做什么,如何工作,怎样使用,如何达到你想要的效果,和处理异常情况.文档中出现的例子在Python2.7和Python3.2中的执行结果相同你可能在寻找Beautiful Soup3的文档,Beautif
2、ul Soup 3 目前已经停止开发,我们推荐在现在的项目中使用Beautiful Soup 4, 移植到BS4寻求帮助如果你有关于BeautifulSoup的问题,可以发送邮件到讨论组 .如果你的问题包含了一段需要转换的HTML代码,那么确保你提的问题描述中附带这段HTML文档的代码诊断1快速开始下面的一段HTML代码将作为例子被多次用到.这是爱丽丝梦游仙境的的一段内容(以后内容中简称为爱丽丝的文档):html_doc =The Dormouses storyThe Dormouses storyOnce upon a time there were three little sisters
3、; and their names wereElsie,Lacie andTillie;and they lived at the bottom of a well.使用BeautifulSoup解析这段代码,能够得到一个BeautifulSoup的对象,并能按照标准的缩进格式的结构输出:frombs4import BeautifulSoupsoup = BeautifulSoup(html_doc)print(soup.prettify()# # # # The Dormouses story# # # # # # The Dormouses story# # # # Once upon a
4、 time there were three little sisters; and their names were# # Elsie# # ,# # Lacie# # and# # Tillie# # ; and they lived at the bottom of a well.# # # .# # # 几个简单的浏览结构化数据的方法:soup.title# The Dormouses storysoup.title.name# utitlesoup.title.string# uThe Dormouses storysoup.title.parent.name# uheadsoup.
5、p# The Dormouses storysoup.pclass# utitlesoup.a# Elsiesoup.find_all(a)# Elsie,# Lacie,# Tilliesoup.find(id=link3)# Tillie从文档中找到所有标签的链接:for link in soup.find_all(a):print(link.get(href)# # # 从文档中获取所有文字内容:print(soup.get_text()# The Dormouses story# The Dormouses story# Once upon a time there were thre
6、e little sisters; and their names were# Elsie,# Lacie and# Tillie;# and they lived at the bottom of a well.# .这是你想要的吗?别着急,还有更好用的安装 Beautiful Soup如果你用的是新版的Debain或ubuntu,那么可以通过系统的软件包管理来安装:$ apt-get install Python-bs4Beautiful Soup 4 通过PyPi发布,所以如果你无法使用系统包管理安装,那么也可以通过easy_install或pip来安装.包的名字是beautifulso
7、up4 ,这个包兼容Python2和Python3.$ easy_install beautifulsoup4$ pip install beautifulsoup4(在PyPi中还有一个名字是BeautifulSoup的包,但那可能不是你想要的,那是Beautiful Soup3的发布版本,因为很多项目还在使用BS3, 所以BeautifulSoup包依然有效.但是如果你在编写新项目,那么你应该安装的beautifulsoup4 )如果你没有安装easy_install或pip ,那你也可以下载BS4的源码 ,然后通过setup.py来安装.$ Python setup.py install
8、如果上述安装方法都行不通,Beautiful Soup的发布协议允许你将BS4的代码打包在你的项目中,这样无须安装即可使用.作者在Python2.7和Python3.2的版本下开发Beautiful Soup, 理论上Beautiful Soup应该在所有当前的Python版本中正常工作安装完成后的问题Beautiful Soup发布时打包成Python2版本的代码,在Python3环境下安装时,会自动转换成Python3的代码,如果没有一个安装的过程,那么代码就不会被转换.如果代码抛出了ImportError的异常: “No module named HTMLParser”, 这是因为你在P
9、ython3版本中执行Python2版本的代码.如果代码抛出了ImportError的异常: “No module named html.parser”, 这是因为你在Python2版本中执行Python3版本的代码.如果遇到上述2种情况,最好的解决方法是重新安装BeautifulSoup4.如果在ROOT_TAG_NAME = udocument代码处遇到SyntaxError “Invalid syntax”错误,需要将把BS4的Python代码版本从Python2转换到Python3. 可以重新安装BS4:$ Python3 setup.py install或在bs4的目录中执行Pyth
10、on代码版本转换脚本$ 2to3-3.2 -w bs4安装解析器Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是lxml .根据操作系统不同,可以选择下列方法来安装lxml:$ apt-get install Python-lxml$ easy_install lxml$ pip install lxml另一个可供选择的解析器是纯Python实现的html5lib , html5lib的解析方式与浏览器相同,可以选择下列方法来安装html5lib:$ apt-get install Python-html5lib$ easy_insta
11、ll html5lib$ pip install html5lib下表列出了主要的解析器,以及它们的优缺点:解析器使用方法优势劣势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) 速
12、度快 唯一支持XML的解析器 需要安装C语言库html5libBeautifulSoup(markup,html5lib) 最好的容错性 以浏览器的方式解析文档 生成HTML5格式的文档 速度慢 不依赖外部扩展推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定.提示: 如果一段HTML或XML文档格式不正确的话,那么在不同的解析器中返回的结果可能是不一样的,查看解析器之间的区别了解更多细节如何使用将一段文档传入Beautifu
13、lSoup 的构造方法,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄.frombs4import BeautifulSoupsoup = BeautifulSoup(open(index.html)soup = BeautifulSoup(data)首先,文档被转换成Unicode,并且HTML的实例都被转换成Unicode编码BeautifulSoup(Sacré bleu!)Sacr bleu!然后,Beautiful Soup选择最合适的解析器来解析这段文档,如果手动指定解析器那么Beautiful Soup会选择指定的解析器来解析文档.(参考解析成XML )
14、.对象的种类Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment .TagTag对象与XML或HTML原生文档中的tag相同:soup = BeautifulSoup(Extremely bold)tag = soup.btype(tag)# Tag有很多方法和属性,在遍历文档树和搜索文档树中有详细解释.现在介绍一下tag中最重要的属性: name和attributesName每个tag都有自己的名字,通过.name来获取:t
15、ag.name# ub如果改变了tag的name,那将影响所有通过当前Beautiful Soup对象生成的HTML文档:tag.name =blockquotetag# Extremely boldAttributes一个tag可能有很多个属性. tag 有一个 “class” 的属性,值为 “boldest” . tag的属性的操作方法与字典相同:tagclass# uboldest也可以直接”点”取属性, 比如: .attrs :tag.attrs# uclass: uboldesttag的属性可以被添加,删除或修改. 再说一次, tag的属性操作方法与字典一样tagclass =ver
16、yboldtagid =1tag# Extremely bolddel tagclassdel tagidtag# Extremely boldtagclass# KeyError: classprint(tag.get(class)# None多值属性HTML 4定义了一系列可以包含多个值的属性.在HTML5中移除了一些,却增加更多.最常见的多值的属性是 class (一个tag可以有多个CSS的class). 还有一些属性rel , rev , accept-charset , headers , accesskey . 在Beautiful Soup中多值属性的返回类型是list:css
17、_soup = BeautifulSoup()css_soup.pclass# body, strikeoutcss_soup = BeautifulSoup()css_soup.pclass# body如果某个属性看起来好像有多个值,但在任何版本的HTML定义中都没有被定义为多值属性,那么Beautiful Soup会将这个属性作为字符串返回id_soup = BeautifulSoup()id_soup.pid# my id将tag转换成字符串时,多值属性会合并为一个值rel_soup = BeautifulSoup(Back to the homepage)rel_soup.arel#
18、indexrel_soup.arel = index, contentsprint(rel_soup.p)# Back to the homepage如果转换的文档是XML格式,那么tag中不包含多值属性xml_soup = BeautifulSoup(, xml)xml_soup.pclass# ubody strikeout可以遍历的字符串字符串常被包含在tag内.Beautiful Soup用NavigableString类来包装tag中的字符串:tag.string# uExtremely boldtype(tag.string)# 一个NavigableString字符串与Pytho
19、n中的Unicode字符串相同,并且还支持包含在遍历文档树和搜索文档树中的一些特性. 通过unicode()方法可以直接将NavigableString对象转换成Unicode字符串:unicode_string =unicode(tag.string)unicode_string# uExtremely boldtype(unicode_string)# tag中包含的字符串不能编辑,但是可以被替换成其它的字符串,用replace_with()方法:tag.string.replace_with(No longer bold)tag# No longer boldNavigableStrin
20、g对象支持遍历文档树和搜索文档树中定义的大部分属性, 并非全部.尤其是,一个字符串不能包含其它内容(tag能够包含字符串或是其它tag),字符串不支持.contents或.string属性或find()方法.如果想在Beautiful Soup之外使用NavigableString对象,需要调用unicode()方法,将该对象转换成普通的Unicode字符串,否则就算Beautiful Soup已方法已经执行结束,该对象的输出也会带有对象的引用地址.这样会浪费内存.BeautifulSoupBeautifulSoup对象表示的是一个文档的全部内容.大部分时候,可以把它当作Tag对象,它支持遍历
21、文档树和搜索文档树中描述的大部分的方法.因为BeautifulSoup对象并不是真正的HTML或XML的tag,所以它没有name和attribute属性.但有时查看它的.name属性是很方便的,所以BeautifulSoup对象包含了一个值为 “document” 的特殊属性.namesoup.name# udocument注释及特殊字符串Tag , NavigableString , BeautifulSoup几乎覆盖了html和xml中的所有内容,但是还有一些特殊对象.容易让人担心的内容是文档的注释部分:markup =soup = BeautifulSoup(markup)commen
22、t = soup.b.stringtype(comment)# Comment对象是一个特殊类型的NavigableString对象:comment# uHey, buddy. Want to buy a used parser但是当它出现在HTML文档中时, Comment对象会使用特殊的格式输出:print(soup.b.prettify()# # # Beautiful Soup中定义的其它类型都可能会出现在XML的文档中: CData , ProcessingInstruction , Declaration , Doctype .与Comment对象类似,这些类都是Navigable
23、String的子类,只是添加了一些额外的方法的字符串独享.下面是用CDATA来替代注释的例子:frombs4import CDatacdata = CData(A CDATA block)comment.replace_with(cdata)print(soup.b.prettify()# # # 遍历文档树还拿”爱丽丝梦游仙境”的文档来做例子:html_doc =The Dormouses storyThe Dormouses storyOnce upon a time there were three little sisters; and their names wereElsie,Lacie andTillie;and they lived at the bottom of a well.frombs4import BeautifulSoupsoup = BeautifulSoup(html_doc)通过这段例子来演示怎样从文档的一段内容找到另一段内容子节点一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点.Beautiful Soup提供了许多操作和遍历子节点的属性.注意: Beautiful Soup中字符串节点不支持这些属性,因为字符串没有子节点tag的名字
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2