Python 之 Beautiful Soup 4文档.docx

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

Python 之 Beautiful Soup 4文档.docx

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

Python 之 Beautiful Soup 4文档.docx

Python之BeautifulSoup4文档

Python之BeautifulSoup4文档

(ps:

其实入门什么的看官方文档是最好的了,这里只是记录一下简单的用法。

  首先先介绍实际工作中最常用的几个方法:

  举例的html代码(就用官方例子好了):

1

2

3Pagetitle

4

5

6

7Thisisparagraphone.

8

9

10Thisisparagraphtwo.

11

12

13

 

0、初始化:

 

1soup=BeautifulSoup(html)#html为html源代码字符串,type(html)==str 

1、用tag获取相应代码块的剖析树:

 

  既然要分析html,首先要找到对我们有用的tag块,beautiful提供了非常便利的方式。

#当用tag作为搜索条件时,我们获取的包含这个tag块的剖析树:

#ooo

#这里获取head这个块

head=soup.find('head')

#or

#head=soup.head

#or

#head=soup.contents[0].contents[0]

运行后,我们会得到:

1

2Pagetitle

3

  find方法在当前tag剖析树(当前这个html代码块中)寻找符合条件的子树并返回。

find方法提供多种查询方式,包括用喜闻乐见的regex哦~之后会详细介绍。

  contents属性是一个列表,里面保存了该剖析树的直接儿子。

如:

1html=soup.contents[0]#...

2head=html.contents[0]#...

3body=html.contents[1]#... 

2、用contents[],parent,nextSibling,previousSibling寻找父子兄弟tag

  为了更加方便灵活的分析html代码块,beautifulSoup提供了几个简单的方法直接获取当前tag块的父子兄弟。

假设我们已经获得了body这个tag块,我们想要寻找,,第一个

第二个

这四个tag块:

#body=soup.bodyhtml=body.parent#html是body的父亲

head=body.previousSibling#head和body在同一层,是body的前一个兄弟

p1=body.contents[0]#p1,p2都是body的儿子,我们用contents[0]取得p1

p2=p1.nextSibling#p2与p1在同一层,是p1的后一个兄弟,当然body.content[1]也可得到

printp1.text

#u'Thisisparagraphone.'

printp2.text

#u'Thisisparagraphtwo.'

#注意:

1,每个tag的text包括了它以及它子孙的text。

2,所有text已经被自动转

#为unicode,如果需要,可以自行转码encode(xxx)

   然而,如果我们要寻找祖先或者孙子tag怎么办呢?

用while循环吗?

不,beautifulsoup已经提供了方法。

 

3、用find,findParent,findNextSibling,findPreviousSibling寻找祖先或者子孙tag:

 

  有了上面的基础,这里应该很好理解了,例如find方法(我理解和findChild是一样的),就是以当前节点为起始,遍历整个子树,找到后返回。

  而这些方法的复数形式,会找到所有符合要求的tag,以list的方式放回。

他们的对应关系是:

find->findall,findParent->findParents,findNextSibling->findNextSiblings...

  如:

1printsoup.findAll('p')

2#[Thisisparagraphone.

,Thisisparagraphtwo.

]

  这里我们重点讲一下find的几种用法,其他的类比:

  find(name=None,attrs={},recursive=True,text=None,**kwargs)

(ps:

只讲几种用法,完整请看官方link:

  1)搜索tag:

1find(tagname)#直接搜索名为tagname的tag如:

find('head')

2find(list)#搜索在list中的tag,如:

find(['head','body'])

3find(dict)#搜索在dict中的tag,如:

find({'head':

True,'body':

True})

4find(pile(''))#搜索符合正则的tag,如:

find(pile('^p'))搜索以p开头的tag

5find(lambda)#搜索函数返回结果为true的tag,如:

find(lambdaname:

iflen(name)==1)搜索长度为1的tag

6find(True)#搜索所有tag

   2)搜索属性(attrs):

1find(id='xxx')#寻找id属性为xxx的

2find(attrs={id=pile('xxx'),algin='xxx'})#寻找id属性符合正则且algin属性为xxx的

3find(attrs={id=True,algin=None})#寻找有id属性但是没有algin属性的

  3)搜索文字(text):

注意,文字的搜索会导致其他搜索给的值如:

tag,attrs都失效。

方法与搜索tag一致

  4)recursive,limit:

  recursive=False表示只搜索直接儿子,否则搜索整个子树,默认为True。

  当使用findAll或者类似返回list的方法时,limit属性用于限制返回的数量,如findAll('p',limit=2):

返回首先找到的两个tag 

*4、用next,previous寻找上下文tag(少用) 

  这里我们主要看看next,next是取得当前的tag的下一个(按代码从上到下的顺序)tag块。

这与contents是不一样的,千万别混淆了哦^^

  我们举个栗子来看看

1

2a

3b

4c

5

 我们看看next的实际效果:

1a=soup.a

2b=soup.b

3n1=b.next

4n2=n1.next

 输出一下:

1printa.next

2#u'a'

3printn1

4#u'b'

5printn2

6#c

所以,next仅仅是获取文档上的“下一个”的tag,和剖析树中的位置无关。

当然也有findNext和findAllNext方法。

至于previous,表示上一个tag块,就类比一下吧~^^

 

*****************完整版******************

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-get install Python-bs4

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

$ easy_install beautifulsoup4

$ pip install beautifulsoup4

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

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

$ Python setup.py install

如果上述安装方法都行不通,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:

$ Python3 setup.py install

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

$ 2to3-3.2 -w bs4

安装解析器

BeautifulSoup支持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_install html5lib

$ pip install html5lib

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

解析器

使用方法

优势

劣势

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

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

当前位置:首页 > 初中教育 > 语文

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

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