Beautiful Soup 420 文档.docx

上传人:b****2 文档编号:577846 上传时间:2023-04-29 格式:DOCX 页数:71 大小:50.53KB
下载 相关 举报
Beautiful Soup 420 文档.docx_第1页
第1页 / 共71页
Beautiful Soup 420 文档.docx_第2页
第2页 / 共71页
Beautiful Soup 420 文档.docx_第3页
第3页 / 共71页
Beautiful Soup 420 文档.docx_第4页
第4页 / 共71页
Beautiful Soup 420 文档.docx_第5页
第5页 / 共71页
Beautiful Soup 420 文档.docx_第6页
第6页 / 共71页
Beautiful Soup 420 文档.docx_第7页
第7页 / 共71页
Beautiful Soup 420 文档.docx_第8页
第8页 / 共71页
Beautiful Soup 420 文档.docx_第9页
第9页 / 共71页
Beautiful Soup 420 文档.docx_第10页
第10页 / 共71页
Beautiful Soup 420 文档.docx_第11页
第11页 / 共71页
Beautiful Soup 420 文档.docx_第12页
第12页 / 共71页
Beautiful Soup 420 文档.docx_第13页
第13页 / 共71页
Beautiful Soup 420 文档.docx_第14页
第14页 / 共71页
Beautiful Soup 420 文档.docx_第15页
第15页 / 共71页
Beautiful Soup 420 文档.docx_第16页
第16页 / 共71页
Beautiful Soup 420 文档.docx_第17页
第17页 / 共71页
Beautiful Soup 420 文档.docx_第18页
第18页 / 共71页
Beautiful Soup 420 文档.docx_第19页
第19页 / 共71页
Beautiful Soup 420 文档.docx_第20页
第20页 / 共71页
亲,该文档总共71页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Beautiful Soup 420 文档.docx

《Beautiful Soup 420 文档.docx》由会员分享,可在线阅读,更多相关《Beautiful Soup 420 文档.docx(71页珍藏版)》请在冰点文库上搜索。

Beautiful Soup 420 文档.docx

BeautifulSoup420文档

BeautifulSoup4.2.0文档¶

BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.BeautifulSoup会帮你节省数小时甚至数天的工作时间.

这篇文档介绍了BeautifulSoup4中所有主要特性,并切有小例子.让我来向你展示它适合做什么,如何工作,怎样使用,如何达到你想要的效果,和处理异常情况.

文档中出现的例子在Python2.7和Python3.2中的执行结果相同

你可能在寻找BeautifulSoup3的文档,BeautifulSoup3目前已经停止开发,我们推荐在现在的项目中使用BeautifulSoup4,移植到BS4

寻求帮助¶

如果你有关于BeautifulSoup的问题,可以发送邮件到讨论组.如果你的问题包含了一段需要转换的HTML代码,那么确保你提的问题描述中附带这段HTML文档的代码诊断[1]

快速开始¶

下面的一段HTML代码将作为例子被多次用到.这是爱丽丝梦游仙境的的一段内容(以后内容中简称为爱丽丝的文档):

html_doc="""

TheDormouse'sstory

TheDormouse'sstory

Onceuponatimetherewerethreelittlesisters;andtheirnameswere

Elsie,

Lacieand

Tillie;

andtheylivedatthebottomofawell.

...

"""

使用BeautifulSoup解析这段代码,能够得到一个BeautifulSoup的对象,并能按照标准的缩进格式的结构输出:

frombs4importBeautifulSoup

soup=BeautifulSoup(html_doc)

print(soup.prettify())

#

#

#</p><p>#TheDormouse'sstory</p><p>#

#

#

#

#

#TheDormouse'sstory

#

#

#

#Onceuponatimetherewerethreelittlesisters;andtheirnameswere

#

#Elsie

#

#,

#

#Lacie

#

#and

#

#Tillie

#

#;andtheylivedatthebottomofawell.

#

#

#...

#

#

#

几个简单的浏览结构化数据的方法:

soup.title

#TheDormouse'sstory

soup.title.name

#u'title'

soup.title.string

#u'TheDormouse'sstory'

soup.title.parent.name

#u'head'

soup.p

#TheDormouse'sstory

soup.p['class']

#u'title'

soup.a

#Elsie

soup.find_all('a')

#[Elsie,

#Lacie,

#Tillie]

soup.find(id="link3")

#Tillie

从文档中找到所有标签的链接:

forlinkinsoup.find_all('a'):

print(link.get('href'))

#

#

#

从文档中获取所有文字内容:

print(soup.get_text())

#TheDormouse'sstory

#

#TheDormouse'sstory

#

#Onceuponatimetherewerethreelittlesisters;andtheirnameswere

#Elsie,

#Lacieand

#Tillie;

#andtheylivedatthebottomofawell.

#

#...

这是你想要的吗?

别着急,还有更好用的

安装BeautifulSoup¶

如果你用的是新版的Debain或ubuntu,那么可以通过系统的软件包管理来安装:

$apt-getinstallPython-bs4

BeautifulSoup4通过PyPi发布,所以如果你无法使用系统包管理安装,那么也可以通过easy_install或pip来安装.包的名字是beautifulsoup4,这个包兼容Python2和Python3.

$easy_installbeautifulsoup4

$pipinstallbeautifulsoup4

(在PyPi中还有一个名字是BeautifulSoup的包,但那可能不是你想要的,那是BeautifulSoup3的发布版本,因为很多项目还在使用BS3,所以BeautifulSoup包依然有效.但是如果你在编写新项目,那么你应该安装的beautifulsoup4)

如果你没有安装easy_install或pip,那你也可以下载BS4的源码,然后通过setup.py来安装.

$Pythonsetup.pyinstall

如果上述安装方法都行不通,BeautifulSoup的发布协议允许你将BS4的代码打包在你的项目中,这样无须安装即可使用.

作者在Python2.7和Python3.2的版本下开发BeautifulSoup,理论上BeautifulSoup应该在所有当前的Python版本中正常工作

安装完成后的问题¶

BeautifulSoup发布时打包成Python2版本的代码,在Python3环境下安装时,会自动转换成Python3的代码,如果没有一个安装的过程,那么代码就不会被转换.

如果代码抛出了ImportError的异常:

“NomodulenamedHTMLParser”,这是因为你在Python3版本中执行Python2版本的代码.

如果代码抛出了ImportError的异常:

“Nomodulenamedhtml.parser”,这是因为你在Python2版本中执行Python3版本的代码.

如果遇到上述2种情况,最好的解决方法是重新安装BeautifulSoup4.

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

$Python3setup.pyinstall

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

$2to3-3.2-wbs4

安装解析器¶

BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是lxml.根据操作系统不同,可以选择下列方法来安装lxml:

$apt-getinstallPython-lxml

$easy_installlxml

$pipinstalllxml

另一个可供选择的解析器是纯Python实现的html5lib,html5lib的解析方式与浏览器相同,可以选择下列方法来安装html5lib:

$apt-getinstallPython-html5lib

$easy_installhtml5lib

$pipinstallhtml5lib

下表列出了主要的解析器,以及它们的优缺点:

解析器

使用方法

优势

劣势

Python标准库

BeautifulSoup(markup,"html.parser")

∙Python的内置标准库

∙执行速度适中

∙文档容错能力强

∙Python2.7.3or3.2.2)前的版本中文档容错能力差

lxmlHTML解析器

BeautifulSoup(markup,"lxml")

∙速度快

∙文档容错能力强

∙需要安装C语言库

lxmlXML解析器

BeautifulSoup(markup,["lxml","xml"])

BeautifulSoup(markup,"xml")

∙速度快

∙唯一支持XML的解析器

∙需要安装C语言库

html5lib

BeautifulSoup(markup,"html5lib")

∙最好的容错性

∙以浏览器的方式解析文档

∙生成HTML5格式的文档

∙速度慢

∙不依赖外部扩展

推荐使用lxml作为解析器,因为效率更高.在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib,因为那些Python版本的标准库中内置的HTML解析方法不够稳定.

提示:

如果一段HTML或XML文档格式不正确的话,那么在不同的解析器中返回的结果可能是不一样的,查看解析器之间的区别了解更多细节

如何使用¶

将一段文档传入BeautifulSoup的构造方法,就能得到一个文档的对象,可以传入一段字符串或一个文件句柄.

frombs4importBeautifulSoup

soup=BeautifulSoup(open("index.html"))

soup=BeautifulSoup("data")

首先,文档被转换成Unicode,并且HTML的实例都被转换成Unicode编码

BeautifulSoup("Sacrébleu!

")

Sacrébleu!

然后,BeautifulSoup选择最合适的解析器来解析这段文档,如果手动指定解析器那么BeautifulSoup会选择指定的解析器来解析文档.(参考解析成XML).

对象的种类¶

BeautifulSoup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

Tag,NavigableString,BeautifulSoup,Comment.

Tag¶

Tag对象与XML或HTML原生文档中的tag相同:

soup=BeautifulSoup('Extremelybold')

tag=soup.b

type(tag)

#

Tag有很多方法和属性,在遍历文档树和搜索文档树中有详细解释.现在介绍一下tag中最重要的属性:

name和attributes

Name¶

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

tag.name

#u'b'

如果改变了tag的name,那将影响所有通过当前BeautifulSoup对象生成的HTML文档:

tag.name="blockquote"

tag

#Extremelybold

Attributes¶

一个tag可能有很多个属性.tag有一个“class”的属性,值为“boldest”.tag的属性的操作方法与字典相同:

tag['class']

#u'boldest'

也可以直接”点”取属性,比如:

.attrs:

tag.attrs

#{u'class':

u'boldest'}

tag的属性可以被添加,删除或修改.再说一次,tag的属性操作方法与字典一样

tag['class']='verybold'

tag['id']=1

tag

#Extremelybold

deltag['class']

deltag['id']

tag

#

Extremelybold

tag['class']

#KeyError:

'class'

print(tag.get('class'))

#None

多值属性¶

HTML4定义了一系列可以包含多个值的属性.在HTML5中移除了一些,却增加更多.最常见的多值的属性是class(一个tag可以有多个CSS的class).还有一些属性rel,rev,accept-charset,headers,accesskey.在BeautifulSoup中多值属性的返回类型是list:

css_soup=BeautifulSoup('

')

css_soup.p['class']

#["body","strikeout"]

css_soup=BeautifulSoup('

')

css_soup.p['class']

#["body"]

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

id_soup=BeautifulSoup('

')

id_soup.p['id']

#'myid'

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

rel_soup=BeautifulSoup('

Backtothehomepage

')

rel_soup.a['rel']

#['index']

rel_soup.a['rel']=['index','contents']

print(rel_soup.p)

#

Backtothehomepage

如果转换的文档是XML格式,那么tag中不包含多值属性

xml_soup=BeautifulSoup('

','xml')

xml_soup.p['class']

#u'bodystrikeout'

可以遍历的字符串¶

字符串常被包含在tag内.BeautifulSoup用NavigableString类来包装tag中的字符串:

tag.string

#u'Extremelybold'

type(tag.string)

#

一个NavigableString字符串与Python中的Unicode字符串相同,并且还支持包含在遍历文档树和搜索文档树中的一些特性.通过unicode()方法可以直接将NavigableString对象转换成Unicode字符串:

unicode_string=unicode(tag.string)

unicode_string

#u'Extremelybold'

type(unicode_string)

#

tag中包含的字符串不能编辑,但是可以被替换成其它的字符串,用replace_with()方法:

tag.string.replace_with("Nolongerbold")

tag

#

Nolongerbold

NavigableString对象支持遍历文档树和搜索文档树中定义的大部分属性,并非全部.尤其是,一个字符串不能包含其它内容(tag能够包含字符串或是其它tag),字符串不支持.contents或.string属性或find()方法.

如果想在BeautifulSoup之外使用NavigableString对象,需要调用unicode()方法,将该对象转换成普通的Unicode字符串,否则就算BeautifulSoup已方法已经执行结束,该对象的输出也会带有对象的引用地址.这样会浪费内存.

BeautifulSoup¶

BeautifulSoup对象表示的是一个文档的全部内容.大部分时候,可以把它当作Tag对象,它支持遍历文档树和搜索文档树中描述的大部分的方法.

因为BeautifulSoup对象并不是真正的HTML或XML的tag,所以它没有name和attribute属性.但有时查看它的.name属性是很方便的,所以BeautifulSoup对象包含了一个值为“[document]”的特殊属性.name

soup.name

#u'[document]'

注释及特殊字符串¶

Tag,NavigableString,BeautifulSoup几乎覆盖了html和xml中的所有内容,但是还有一些特殊对象.容易让人担心的内容是文档的注释部分:

markup="

--Hey,buddy.Wanttobuyausedparser?

-->"

soup=BeautifulSoup(markup)

comment=soup.b.string

type(comment)

#

Comment对象是一个特殊类型的NavigableString对象:

comment

#u'Hey,buddy.Wanttobuyausedparser'

但是当它出现在HTML文档中时,Comment对象会使用特殊的格式输出:

print(soup.b.prettify())

#

#

--Hey,buddy.Wanttobuyausedparser?

-->

#

BeautifulSoup中定义的其它类型都可能会出现在XML的文档中:

CData,ProcessingInstruction,Declaration,Doctype.与Comment对象类似,这些类都是NavigableString的子类,只是添加了一些额外的方法的字符串独享.下面是用CDATA来替代注释的例子:

frombs4importCData

cdata=CData("ACDATAblock")

comment.replace_with(cdata)

print(soup.b.prettify())

#

#

[CDATA[ACDATAblock]]>

#

遍历文档树¶

还拿”爱丽丝梦游仙境”的文档来做例子:

html_doc="""

TheDormouse'sstory

TheDormouse'sstory

Onceuponatimetherewerethreelittlesisters;andtheirnameswere

Elsie,

Lacieand

Tillie;

andtheylivedatthebottomofawell.

...

"""

frombs4importBeautifulSoup

soup=BeautifulSoup(html_doc)

通过这段例子来演示怎样从文档的一段内容找到另一段内容

子节点¶

一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点.BeautifulSoup提供了许多操作和遍历子节点的属性.

注意:

BeautifulSoup中字符串节点不支持这些属性,因为字符串没有子节点

tag的名字

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2