1、 class=sister id=link1Elsie,link2Lacie andlink3Tillie;and they lived at the bottom of a well.使用BeautifulSoup解析这段代码,能够得到一个BeautifulSoup的对象,并能按照标准的缩进格式的结构输出:frombs4import BeautifulSoupsoup = BeautifulSoup(html_doc)print(soup.prettify()# /html几个简单的浏览结构化数据的方法:soup.titlesoup.title.name# utitlesoup.title.
2、strings storysoup.title.parent.nameheadsoup.psoup.pclasssoup.asoup.find_all(a)# soup.find(id=从文档中找到所有标签的链接:for link in soup.find_all():print(link.get(href)# 从文档中获取所有文字内容:print(soup.get_text()# Elsie,# Lacie and# Tillie;# and they lived at the bottom of a well.这是你想要的吗?别着急,还有更好用的安装 Beautiful Soup如果你用的
3、是新版的Debain或ubuntu,那么可以通过系统的软件包管理来安装:$ apt-get install Python-bs4Beautiful Soup 4 通过PyPi发布,所以如果你无法使用系统包管理安装,那么也可以通过easy_install或pip来安装.包的名字是beautifulsoup4 ,这个包兼容Python2和Python3.$ easy_install beautifulsoup4$ pip install beautifulsoup4(在PyPi中还有一个名字是BeautifulSoup的包,但那可能不是你想要的,那是Beautiful Soup3的发布版本,因为很
4、多项目还在使用BS3, 所以BeautifulSoup包依然有效.但是如果你在编写新项目,那么你应该安装的beautifulsoup4 )如果你没有安装easy_install或pip ,那你也可以下载BS4的源码 ,然后通过setup.py来安装.$ Python setup.py install如果上述安装方法都行不通,Beautiful Soup的发布协议允许你将BS4的代码打包在你的项目中,这样无须安装即可使用.作者在Python2.7和Python3.2的版本下开发Beautiful Soup, 理论上Beautiful Soup应该在所有当前的Python版本中正常工作安装完成后的
5、问题Beautiful Soup发布时打包成Python2版本的代码,在Python3环境下安装时,会自动转换成Python3的代码,如果没有一个安装的过程,那么代码就不会被转换.如果代码抛出了ImportError的异常: “No module named HTMLParser”, 这是因为你在Python3版本中执行Python2版本的代码. “No module named html.parser”, 这是因为你在Python2版本中执行Python3版本的代码.如果遇到上述2种情况,最好的解决方法是重新安装BeautifulSoup4.如果在ROOT_TAG_NAME = udocum
6、ent代码处遇到SyntaxError “Invalid syntax”错误,需要将把BS4的Python代码版本从Python2转换到Python3. 可以重新安装BS4:$ Python3 setup.py install或在bs4的目录中执行Python代码版本转换脚本$ 2to3-3.2 -w bs4安装解析器Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是lxml .根据操作系统不同,可以选择下列方法来安装lxml:$ apt-get install Python-lxml$ easy_install lxml$ pip in
7、stall lxml另一个可供选择的解析器是纯Python实现的html5lib , html5lib的解析方式与浏览器相同,可以选择下列方法来安装html5lib:$ apt-get install Python-html5lib$ easy_install html5lib$ pip install html5lib下表列出了主要的解析器,以及它们的优缺点:解析器使用方法优势劣势Python标准库BeautifulSoup(markup,html.parser Python的内置标准库 执行速度适中 文档容错能力强 Python 2.7.3 or 3.2.2)前的版本中文档容错能力差lxm
8、l HTML 解析器lxml 速度快 需要安装C语言库lxml XML 解析器BeautifulSoup(markup, xml) 唯一支持XML的解析器html5libhtml5lib 最好的容错性 以浏览器的方式解析文档 生成HTML5格式的文档 速度慢 不依赖外部扩展推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定.提示: 如果一段HTML或XML文档格式不正确的话,那么在不同的解析器中返回的结果可能是不一样的,查看解
9、析器之间的区别了解更多细节如何使用将一段文档传入BeautifulSoup 的构造方法,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄.soup = BeautifulSoup(open(index.htmlsoup = BeautifulSoup(data首先,文档被转换成Unicode,并且HTML的实例都被转换成Unicode编码BeautifulSoup(Sacré bleu!Sacr然后,Beautiful Soup选择最合适的解析器来解析这段文档,如果手动指定解析器那么Beautiful Soup会选择指定的解析器来解析文档.(参考解析成XML ).对象的
10、种类Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment .TagTag对象与XML或HTML原生文档中的tag相同:soup = BeautifulSoup(b class=boldestExtremely boldAttributes一个tag可能有很多个属性. tag # KeyError: print(tag.get(# None多值属性HTML 4定义了一系列可以包含多个值的属性.在HTML5中移除了一些,却增加更多
11、.最常见的多值的属性是 class (一个tag可以有多个CSS的class). 还有一些属性rel , rev , accept-charset , headers , accesskey . 在Beautiful Soup中多值属性的返回类型是list:css_soup = BeautifulSoup(body strikeoutcss_soup.p# bodystrikeout如果某个属性看起来好像有多个值,但在任何版本的HTML定义中都没有被定义为多值属性,那么Beautiful Soup会将这个属性作为字符串返回id_soup = BeautifulSoup(p id=my idid
12、_soup.p# my id将tag转换成字符串时,多值属性会合并为一个值rel_soup = BeautifulSoup(pBack to the a rel=indexhomepagerel_soup.arel# index = , contentsprint(rel_soup.p)index contents如果转换的文档是XML格式,那么tag中不包含多值属性xml_soup = BeautifulSoup(xmlxml_soup.pbody strikeout可以遍历的字符串字符串常被包含在tag内.Beautiful Soup用NavigableString类来包装tag中的字符串
13、:tag.stringExtremely boldtype(tag.string)bs4.element.NavigableString一个NavigableString字符串与Python中的Unicode字符串相同,并且还支持包含在遍历文档树和搜索文档树中的一些特性. 通过unicode()方法可以直接将NavigableString对象转换成Unicode字符串:unicode_string =unicode(tag.string)unicode_stringtype(unicode_string)type unicodetag中包含的字符串不能编辑,但是可以被替换成其它的字符串,用re
14、place_with()方法:tag.string.replace_with(No longer boldNo longer boldsoup = BeautifulSoup(markup)comment = soup.b.stringtype(comment)bs4.element.CommentComment对象是一个特殊类型的NavigableString对象:commentHey, buddy. Want to buy a used parser但是当它出现在HTML文档中时, Comment对象会使用特殊的格式输出:print(soup.b.prettify()Beautiful S
15、oup中定义的其它类型都可能会出现在XML的文档中: CData , ProcessingInstruction , Declaration , Doctype .与Comment对象类似,这些类都是NavigableString的子类,只是添加了一些额外的方法的字符串独享.下面是用CDATA来替代注释的例子:frombs4import CDatacdata = CData(A CDATA blockcomment.replace_with(cdata)CDATAA CDATA block遍历文档树还拿”爱丽丝梦游仙境”的文档来做例子:通过这段例子来演示怎样从文档的一段内容找到另一段内容子节点一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点.Beautiful Soup提供了许多操作和遍历子节点的属性.注意: Beautiful Soup中字符串节点不支持这些属性,因为字符串没有子节点tag的名字
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2