一.BeautifulSoup是一个类,用来处理html文件有很多方法,实例化需要传入两个参数,一个是html文件,一个是'html.parser'
#使用BeautifulSoup
from bs4 import BeautifulSoup
#一个例子
from urllib.request import urlopen
from bs4 import BeautifulSoup
url='http://www.baidu.com'
html=urlopen(url)
bsobj=BeautifulSoup(html.read(),'html.parser')#直接把html内容转换为了BeautifulSoup类,传入html.read()参数,实例化类
html_body=bsobj.body
#若body中有h1标签
html_h1=bsobj.body.h1
二.BeautifulSoup的find()以及findAll()方法
(1)find与findAll
-findAll(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
返回的是<class 'bs4.element.ResultSet'>不能进行树形结构操作
-find(self, name=None, attrs={}, recursive=True, text=None, **kwargs)
返回的还是<class 'bs4.element.Tag'>时BeautifulSoup的基类,结构没有破坏,可以进行导航树操作
可以查找该对象的子标签,后代标签,父标签,兄弟标签。
其实find()是limit=1是findAll()
这两个方法所有参数都是用默认值参数创建的(最后keyword是用关键字参数的收集),所以可以没有任何
1)tag:可以是一个标签,也可以是标签字典
eg:obj.findAll({'h1','h2','h3'})
2)attributes:是字典,key是属性,value是属性值(多个值时用字典表示)
!!!!并且若只输入一个参数时!要加attrs={}!!!,否则会赋值给name
eg:obj.findAll('span',{'class':{'green','red'}})
返回html文档中红色和绿色两种颜色的span标签
3)text:用标签的文本内容去匹配,text的内容也可以用正则表达式匹配模式进行匹配,即text=re.compile('')
eg:obj.findAll(text='python')
会返回所以的包含python内容的标签
注:常用就这3个参数
(2)导航树
只有用find查找的结果才能进行导航树操作,因为原始结构还保留
eg:
from urllib.request import urlopen
from bs4 import BeautifulSoup
url='http://www.baidu.com'
html=urlopen(url)
bsobj=BeautifulSoup(html.read(),'html.parser')
nuomi=bsobj.find('a',text='糯米')
nuomi2=bsobj.findAll('a',text='糯米')
print(type(nuomi))
print(type(nuomi2))
print('产生一个兄弟标签生成器','\n')
for i in nuomi.next_siblings:#产生一个兄弟标签生成器(包含除自己之外的兄弟标签顺序有页面顺序决定)
print(i)
print('\n'*2,'糯米的下一个兄弟标签')
print(nuomi.next_sibling)#下一个兄弟标签
print('\n','糯米的父标签')
print(nuomi.parent)#生产父标签
u1=bsobj.find('div',{'class':'head_wrapper'})
for i in u1.children:
print(i)
for i in u1.descendents:
print(i)
#会有很多结构,因为会列出子标签的子标签。
三、获得文本和属性,lambda表达式
(1)获得文本tag.getText()
eg:>>> nuomi.getText()
'糯米'
(2)获得属性tag.attrs
eg:>>> nuomi.attrs
{'href': 'http://www.nuomi.com/?cid=002540', 'name': 'tj_trnuomi', 'class': ['mnav']}
(3)在finAll函数中才能用lambda表达式:但是tag要作为lambda表达式的参数
eg:soup.findAll(lambda tag:len(tag.attrs)==2)
网友评论