《Python 之 Beautiful Soup 4文档.docx》由会员分享,可在线阅读,更多相关《Python 之 Beautiful Soup 4文档.docx(75页珍藏版)》请在冰豆网上搜索。
1html=soup.contents[0]#...
...
find->findall,findParent->findParents,findNextSibling->findNextSiblings...
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'sstoryTheDormouse'sstory
Onceuponatimetherewerethreelittlesisters;andtheirnameswere
Elsie,
Lacieand
Tillie;
andtheylivedatthebottomofawell.
...
"""
使用BeautifulSoup解析这段代码,能够得到一个 BeautifulSoup 的对象,并能按照标准的缩进格式的结构输出:
frombs4importBeautifulSoup
soup=BeautifulSoup(html_doc)
print(soup.prettify())
#
#
#
#TheDormouse'sstory
#
#
#
#
#
#TheDormouse'sstory
#
#
#
#Onceuponatimetherewerethreelittlesisters;andtheirnameswere
#
#Elsie
#
#,
#
#Lacie
#
#and
#
#Tillie
#
#;andtheylivedatthebottomofawell.
#
#
#...
#
#
#
几个简单的浏览结构化数据的方法:
soup.title
#
TheDormouse'sstorysoup.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