BeautifulSoup模块函数详解
BeautifulSoup是Python的⼀个库,最主要的功能就是从⽹页爬取我们需要的数据。BeautifulSoup将html解析为对象进⾏处理,全部页⾯转变为字典或者数组,相对于正则表达式的⽅式,可以⼤⼤简化处理过程。
0x01 安装
建议安装BeautifulSoup 4版本利⽤pip进⾏安装:
pip install beautifulsoup4
BeautifulSoup默认⽀持Python的标准HTML解析库,但是它也⽀持⼀些第三⽅的解析库:
序号解析库使⽤⽅法优势劣势
1Python标准库BeautifulSoup(html,’html.parser’)Python内置标准库;执⾏速度快容错能⼒较差
2lxml HTML解析库BeautifulSoup(html,’lxml’)速度快;容错能⼒强需要安装,需要C语⾔库
3lxml XML解析库BeautifulSoup(html,[‘lxml’,’xml’])速度快;容错能⼒强;⽀持XML格式需要C语⾔库
4htm5lib解析库BeautifulSoup(html,’htm5llib’)以浏览器⽅式解析,最好的容错性速度慢
0x02 创建对象
导⼊库:
from bs4 import BeautifulSoup
创建实例:
url='www.baidu'
resp=urllib2.urlopen(url)
ad()
创建对象:
bs=BeautifulSoup(html)
格式化输出内容:
print bs.prettify()
0x03 对象种类
BeautifulSoup将复杂的html⽂档转换为树形结构,每⼀个节点都是⼀个对象,这些对象可以归纳为⼏种:
(1)Tagcss 属性选择器
Tag相当于html种的⼀个标签:
#提取Tag
print bs.title
print type(bs.title)
结果:
<title>百度⼀下,你就知道</title>
<class 'bs4.element.Tag'>
对于Tag,有⼏个重要的属性:
name:每个Tag对象的name就是标签本省的名称;
attrs:每个Tag对象的attrs就是⼀个字典,包含了标签的全部属性。
print bs.a.name
print bs.a.attrs
输出:
a
{u'href': u'/', u'id': u'result_logo', u'onmousedown': u"return c({'fm':'tab','tab':'logo'})"}
(2)NavigableString
Comment是⼀种特殊的NavigableString,对应的是注释的内容,但是其输出不包含注释符。看这样的⼀个例⼦:#coding:utf-8
from bs4 import BeautifulSoup
html='''
<a class="css" href="example/test" id="test"><!--test --></a>
'''
bs=BeautifulSoup(html,"html.parser")
print bs.a
print bs.a.string
运⾏结果:
<a class="css" href="example/test" id="test"><!--def --></a>
a标签的内容是注释,但是使⽤.string仍然输出了。这种情况下,我们需要做下判断:
#判断是否是注释
if type(bs.a.string)==element.Comment:
print bs.a.string
再看下⾯的例⼦:
<a class="css1" href="example/cdd" id="css">abc<!--def -->gh</a>
内容是注释和字符串混合,此时可以⽤contents获取全部对象:
for i in ts:
print i
如果需要忽略注释内容的话,可以利⽤get_text()或者.text:
print _text()
如果想在BeutifulSoup之外使⽤ NavigableString 对象,需要调⽤unicode()⽅法,将该对象转换成普通的Unicode字符串,否则就算BeautifulSoup已⽅法已经执⾏结束,该对象的输出也会带有对象的引⽤地址,这样会浪费内存。
0x04 搜索⽂档树
重点介绍下find_all()⽅法:
find_all( name , attrs , recursive , text , **kwargs )
(1)name参数
name参数可以查所有名字为name的Tag,字符串对象⾃动忽略掉。
print bs.find_all('a')
传列表:
print bs.find_all(['a','b'])
传⼊正则表达式:
print bs.find_all(repile('^b'))
所有以b开头的标签对象都会被到。
传递⽅法:
def has_class_but_not_id(tag):
return tag.has_attr('class') and not tag.has_attr('id')
print bs.find_all(has_class_but_not_id)
(2)kwyowrds关键字
print bs.find_all(id='css')
print bs.find_all(id=repile('^a'))
还可以混合使⽤:
print bs.find_all(id='css',href=repile('^ex'))
可以使⽤class作为过滤,但是class是Python中的关键字,可以使⽤class_代替,或者采⽤字典的形式传输参数:
print bs.find_all(class_='css')
print bs.find_all(attrs={'class':'css'})
(3)text参数
⽤来搜索⽂档中的字符串内容,text参数也接收字符串、正则表达式、列表、True等参数。
print bs.find_all(text=repile('^abc'))
(4)limit参数
限制返回对象的个数,与数据库SQL查询类似。
(5)recursive参数
调⽤tag的find_all()⽅法时,BeautifulSoup会检索当前tag的所有⼦孙节点,如果只想搜索tag的直接⼦节点,可以使⽤参数recursive=False。
0x05 CSS选择器
可以采⽤CSS的语法格式来筛选元素:
#标签选择器
print bs.select('a')
#类名选择器
print bs.select('.css')
#id选择器
print bs.select('#css')
#属性选择器
print bs.select('a[class="css"]')
#遍历
for tag in bs.select('a'):
_text()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论