python中beautifulsoup的作⽤_Python3中BeautifulSoup。。
。
BeautifulSoup的使⽤
我们学习了正则表达式的相关⽤法,但是⼀旦正则写的有问题,可能得到的就不是我们想要的结果了,⽽且对于⼀个⽹页来说,都有⼀定的特殊的结构和层级关系,⽽且很多标签都有id或class来对作区分,所以我们借助于它们的结构和属性来提取不也是可以的吗?
所以,这⼀节我们就介绍⼀个强⼤的解析⼯具,叫做BeautiSoup,它就是借助⽹页的结构和属性等特性来解析⽹页的⼯具,有了它我们不⽤再去写⼀些复杂的正则,只需要简单的⼏条语句就可以完成⽹页中某个元素的提取。
废话不多说,接下来我们就来感受⼀下BeautifulSoup的强⼤之处吧。
BeautifulSoup简介
简单来说,BeautifulSoup就是Python的⼀个HTML或XML的解析库,我们可以⽤它来⽅便地从⽹页中提取数据,官⽅的解释如下:BeautifulSoup提供⼀些简单的、python式的函数⽤来处理导航、搜索、修改
分析树等功能。它是⼀个⼯具箱,通过解析⽂档为⽤户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出⼀个完整的应⽤程序。BeautifulSoup⾃动将输⼊⽂档转换为Unicode编码,输出⽂档转换为utf-8编码。你不需要考虑编码⽅式,除⾮⽂档没有指定⼀个编码⽅式,这时你仅仅需要说明⼀下原始编码⽅式就可以了。BeautifulSoup已成为和lxml、html6lib⼀样出⾊的python解释器,为⽤户灵活地提供不同的解析策略或强劲的速度。
所以说,利⽤它我们可以省去很多繁琐的提取⼯作,提⾼解析效率。
安装
使⽤之前,我们当然需要⾸先说明⼀下它的安装⽅式。⽬前BeautifulSoup的最新版本是4.x版本,之前的版本已经停⽌开发了,推荐使⽤pip来安装,安装命令如下:
pip3 install beautifulsoup4
当然也可以从pypi下载whl⽂件安装,链接如下:
好,安装完成之后可以验证⼀下,写⼀段Python程序试验⼀下。
from bs4 import BeautifulSoup
soup = BeautifulSoup('
Hello
', 'html.parser')
print(soup.p.string)
运⾏结果
Hello
如果没有报错,则证明安装没有问题,关于它的解析⽤法我们在后⾯会详细介绍。注意在这⾥我们虽然安装的是beautifulsoup4这个包,但是在引⼊的时候是引⼊的bs4,这是因为这个包源代码本⾝的库⽂件夹名称就是bs4,所以安装完成之后,这个库⽂件夹就被移⼊到我们本机Python3的lib库⾥,所以识别到的库⽂件名称就叫做bs4,所以我们引⼊的时候就引⼊bs4这个包。因此,包本⾝的名称和我们使⽤时导⼊的包的名称并不⼀定是⼀致的。
解析器
BeautifulSoup在解析的时候实际上是依赖于解析器的,它除了⽀持Python标准库中的HTML解析器,还⽀持⼀些第三⽅的解析器⽐如lxml,下⾯我们对BeautifulSoup⽀持的解析器及它们的⼀些优缺点做⼀个简单的对⽐。
解析器使⽤⽅法优势劣势
Python标准库BeautifulSoup(markup, 'html.parser')Python的内置标准库、执⾏速度适中 、⽂档容错能⼒强Python 2.7.3 or 3.2.2)前的版本中⽂容错能⼒差
lxml HTML 解析器BeautifulSoup(markup, 'lxml')速度快、⽂档容错能⼒强需要安装C语⾔库
lxml XML 解析器BeautifulSoup(markup, 'xml')速度快、唯⼀⽀持XML的解析器需要安装C语⾔库
html5libBeautifulSoup(markup, 'html5lib')最好的容错性、以浏览器的⽅式解析⽂档、⽣成HTML5格式的⽂档速度慢、不依赖外部扩展
所以通过以上对⽐可以看出,lxml这个解析器有解析HTML和XML的功能,⽽且速度快,容错能⼒强,所以推荐使⽤这个库来进⾏解析,但是这⾥的劣势是必须安装⼀个C语⾔库,它叫做lxml,我们在这⾥依然使⽤pip安装即可,命令如下:
pip3 install lxml
安装完成之后,我们就可以使⽤lxml这个解析器来解析了,在初始化的时候我们可以把第⼆个参数改为lxml,如下:
from bs4 import BeautifulSoup
soup = BeautifulSoup('
Hello
', 'lxml')
print(soup.p.string)
运⾏结果是完全⼀致的,后⾯BeautifulSoup的⽤法实例也统⼀⽤这个库来演⽰。
基本使⽤
下⾯我们⾸先⽤⼀个实例来感受⼀下BeautifulSoup的基本使⽤:
html = '''
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
,
and
;
and they lived at the bottom of a well.
...
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.prettify())
print(soup.title.string)
运⾏结果:
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
,
Lacie
and
Tillie
;
and they lived at the bottom of a well.
.
..
The Dormouse's story
⾸先我们声明了⼀个变量html,它是⼀个HTML字符串,但是注意到,它并不是⼀个完整的HTML字符串,
和标签都没有闭合,但是我们将它当作第⼀个参数传给BeautifulSoup对象,第⼆个参数传⼊的是解析器的类型,在这⾥我们使⽤lxml,这样就完成了BeaufulSoup对象的初始化,将它赋值给soup这个变量。
那么接下来我们就可以通过调⽤soup的各个⽅法和属性对这串HTML代码解析了。
我们⾸先调⽤了prettify()⽅法,这个⽅法可以把要解析的字符串以标准的缩进格式输出,在这⾥注意到输出结果⾥⾯包含了和标签,也就是说对于不标准的HTML字符串BeautifulSoup可以⾃动更正格式,这⼀步实际上不是由prettify()⽅法做的,这个更正实际上在初始化BeautifulSoup时就完成了。
然后我们调⽤了soup.title.string,这个实际上是输出了HTML中
标签的⽂本内容。所以soup.title就可以选择出HTML中的标签,再调⽤string属性就可以得到⾥⾯的⽂本了,所以我们就可以通过简单地调⽤⼏个属性就可以完成⽂本的提取了,是不是⾮常⽅便?
标签选择器
刚才我们选择元素的时候直接通过调⽤标签的名称就可以选择节点元素了,然后再调⽤string属性就可以得到标签内的⽂本了,这种选择⽅式速度⾮常快,如果单个标签结构话层次⾮常清晰,可以选⽤这种⽅式来解析。
选择元素
下⾯我们再⽤⼀个例⼦详细说明⼀下它的选择⽅法。
html = '''
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
,
and
;
and they lived at the bottom of a well.
...
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.title)
print(type(soup.title))
print(soup.title.string)
print(soup.head)
print(soup.p)
运⾏结果:
The Dormouse's story
The Dormouse's story
The Dormouse's story
The Dormouse's story
在这⾥我们依然选⽤了刚才的HTML代码,我们⾸先打印输出了title标签的选择结果,输出结果正是title标签加⾥⾯的⽂字内容。接下来输出了它的类型,是bs4.element.Tag类型,这是BeautifulSoup中的⼀个重要的数据结构,经过选择器选择之后,选择结果都是这种Tag类型,它具有⼀些属性⽐如string属性,调⽤Tag的string属性,就可以得到节点的⽂本内容了,所以接下来的输出结果正是节点的⽂本内容。
接下来我们⼜尝试选择了head标签,结果也是标签加其内部的所有内容,再接下来选择了p标签,不过这次情况⽐较特殊,我们发现结果是第⼀个p标签的内容,后⾯的⼏个p标签并没有选择到,也就是说,当有多个标签时,这种选择⽅式只会选择到第⼀个匹配的标签,其他的后⾯的标签都会忽略。
提取信息
在上⾯我们演⽰了调⽤string属性来获取⽂本的值,那我们要获取标签属性值怎么办呢?获取标签名怎么办呢?下⾯我们来统⼀梳理⼀下信息的提取⽅式
获取名称
可以利⽤name属性来获取标签的名称。还是以上⾯的⽂本为例,我们选取title标签,然后调⽤name属性就可以得到标签名称。
print(soup.title.name)
运⾏结果:
title
获取属性
每个标签可能有多个属性,⽐如id,class等等,我们选择到这个节点元素之后,可以调⽤attrs获取所有属性。
print(soup.p.attrs)
print(soup.p.attrs['name'])
运⾏结果:python官方文档中文版
{'class': ['title'], 'name': 'dromouse'}
dromouse
可以看到attrs的返回结果是字典形式,把选择的标签的所有属性和属性值组合成⼀个字典,接下来如果要获取name属性,就相当于从字典中获取某个键值,只需要⽤中括号加属性名称就可以得到结果了,⽐如获取name属性就可以通过attrs['name']得到相应的属性值。
其实这样的写法还有点繁琐,还有⼀种更简单的获取⽅式,我们可以不⽤写attrs,直接节点元素后⾯加中括号,传⼊属性名就可以达到属性值了,样例如下:
print(soup.p['name'])
print(soup.p['class'])
运⾏结果:
dromouse
['title']
在这⾥注意到有的返回结果是字符串,有的返回结果是字符串组成的列表。⽐如name属性的值是唯⼀的,返回的结果就是单个字符串,⽽对于class,⼀个节点元素可能由多个class,所以返回的是列表,所以在实际处理过程中要注意判断类型。
获取内容
可以利⽤string属性获取节点元素包含的⽂本内容,⽐如上⾯的⽂本我们获取第⼀个p标签的⽂本:
print(soup.p.string)
运⾏结果:
The Dormouse's story
再次注意⼀下这⾥选择到的p标签是第⼀个p标签,获取的⽂本也就是第⼀个p标签⾥⾯的⽂本。
嵌套选择
在上⾯的例⼦中我们知道每⼀个返回结果都是bs4.element.Tag类型,它同样可以继续调⽤标签进⾏下⼀步的选择,⽐如我们获取了head 节点元素,我们可以继续调⽤head来选取其内部的head节点元素。
html = '''
The Dormouse's story'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.head.title)
print(type(soup.head.title))
print(soup.head.title.string)
运⾏结果:
The Dormouse's story
The Dormouse's story
第⼀⾏结果是我们调⽤了head之后再次调⽤了title来选择的title节点元素,然后我们紧接着打印输出了它的类型,可以看到它仍然是
bs4.element.Tag类型,也就是说我们在Tag类型的基础上再次选择得到的依然还是Tag类型,每次返回的结果都相同,所以这样我们就可以这样做嵌套的选择了。
最后输出了⼀下它的string属性,也就是标签⾥的⽂本内容。
关联选择
我们在做选择的时候有时候不能做到⼀步就可以选择到想要的节点元素,有时候在选择的时候需要先选中某⼀个节点元素,然后以它为基准再选择它的⼦节点、⽗节点、兄弟节点等等。所以在这⾥我们就介绍下如何来选择这些节点元素。
⼦节点和⼦孙节点
选取到了⼀个节点元素之后,如果想要获取它的直接⼦节点可以调⽤contents属性,我们⽤⼀个实例来感受⼀下:
html = '''
The Dormouse's story
Once upon a time there were three little sisters; and their names were
Elsie
and
and they lived at the bottom of a well.
...
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论