简单使用:
说明:选择器 ,jquery
基于选择器的使用
from bs4 import BeautifulSoup
使用方式:可以将一个html文件转化为指定的对象;然后通过对象的方法或者属性去查找指定的内容
- 转化本地文件:
soup=BeautifulSoup(open('本地文件',‘lxml’)) - 转化网络文件:
soup=BeautifulSoup('字符串类型或者字节类型',‘lxml’)
例:本地文件soup.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试bs4</title>
</head>
<body>
<div>
甄姬
<p>百里守约</p>
<p>李白</p>
太乙真人
</div>
<div class="song">
<p>李清照</p>
<p>王安石</p>
<p>苏轼</p>
<p>柳宗元</p>
<a href="http://www.song.com/" title="赵匡胤" target="_self">宋朝是最强大的王朝,不是军队的强大。而是经济很强大,国民都很有钱</a>
<a href="" class="song">总为浮云能蔽日,长安不见使人愁</a>
<img src="http://www.baidu.com/meinv.jpg" alt="">
</div>
<div class="tang">
<ul>
<li><a href="http://www.baidu.com" title="qing">
清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指鲜花村</a></li>
<li><a href="http://www.163.com" title="qin">
秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li>
<li><a href="http://www.126.com" alt="tang">
气王宅里寻常见,催九堂前几度闻,正是江南好风景,落花时节又逢君</a></li>
<li><a href="http://www.sina.com" class="song">杜甫</a></li>
<li><a href="http://www.haha.com" class="song">杜牧</a></li>
<li><b>杜小月</b></li>
<li><i>度蜜月</i></li>
<li><a href="http://www.haha.com" id="yuan">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘</a></li>
</ul>>
</div>
</body>
</html>
’print(soup)‘会把soup.html文件内容打开为字符串,封装str方法
'print(tpye(soup))'会显示''<class 'bs4.BeautifulSoup'>''为bs4.BeautifulSoup的一个类,把类转化为soup对象,然后使用类的方法操作进行对象的操作
1. 根据标签名查找
soup.a 只能找到第一个符合要求的标签
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('soup_test.html',encoding='utf8'),'lxml')
print(soup.a)
- 查找a标签:
soup.a---->print(soup.a)显示如下:
<a href="http://www.song.com">宋朝是最强大的王朝,不是军队的强大。而是经济很强大,国民都很有钱</a>
print(type(soup.a))
<class 'bs4.element.Tag'>
- 查找div标签
print(soup.div)显示:
<div class="song">
<p>李清照</p>
<p>王安石</p>
<p>苏轼</p>
<p>柳宗元</p>
<a href="http://www.song.com">宋朝是最强大的王朝,不是军队的强大。而是经济很强大,国民都很有钱</a>
</div>
2. 获取属性
- soup.a.attrs 获取所有属性和值,返回一个字典
- soup.a.attrs['href'] 获取href属性
- soup.a['href'] 也可简写为这种形式
获取a的属性。包含href和内容,以href为例:
‘print(soup.a.href)’显示打印:
None
[Finished in 0.4s]
‘print(soup.a['href'])’显示打印:
http://www.song.com
[Finished in 0.4s]
‘print(soup.a['title'])’显示打印:
赵匡胤
[Finished in 0.4s]
‘print(soup.a['target'])’显示打印:
_self
[Finished in 0.4s]
‘print(soup.a.attrs)’显示打印a的所有属性,打印的是一个字典键值对:
{'href': 'http://www.song.com/', 'title': '赵匡胤', 'target': '_self'}
[Finished in 0.4s]
- 以上获取a的属性方法等价于‘print(soup.a.attrs['href'])’<<=>>‘print(soup.a['href'])’
3. 获取内容
- soup.a.string
- soup.a.text
- soup.a.get_text()
如果标签还有标签,那么string获取到的结果为None ,而其他两个可以获取文本内容
print(soup.a.html)打印显示a的内容:
None
[Finished in 0.4s]
错误,没有显示出来
print(soup.a.text)打印显示a的内容:
宋朝是最强大的王朝,不是军队的强大。而是经济很强大,国民都很有钱
[Finished in 0.4s]
正确,可以显示出来
还可以这么写'print(soup.a.string)'显示结果是一样的,如果a标签里还有标签那么显示为None
还可以这么写’print(soup.a.get_text())‘显示结果也一样
4.find方法:
- soup.find('a') 找到第一个符合要求的a
- soup.find('a',title="xxx")
- soup.find('a',alt="xxx")
- soup.find('a',class_="xxx")
- soup.find('a',id="xxx")
- find方法不仅soup可以调用,普通的div对象也能调用,会去指定的div里面去找符合要求的节点
- find找到的都是第一个符合要求的标签
print(soup.find('a'))显示内容为:
<a href="http://www.song.com/" target="_self" title="赵匡胤">宋朝是最强大的王朝,不是军队的强大。而是经济很强大,国民都很有钱</a>
[Finished in 0.4s]
print(soup.find('a',title='qin'))显示内容为:
<a href="http://www.163.com" title="qin">
秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a>
[Finished in 0.4s]
print(soup.find('a',alt='tang'))显示内容为:
<a alt="tang" href="http://www.126.com">
气王宅里寻常见,催九堂前几度闻,正是江南好风景,落花时节又逢君</a>
[Finished in 0.4s]
print(soup.find('a',class_='song'))显示内容为:
<a class="song" href="">总为浮云能蔽日,长安不见使人愁</a>
[Finished in 0.4s]
以上显示第一个标签class='song'的内容
*如果想显示另外标签相同的class时,可以这么用
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('soup_test.html',encoding='utf8'),'lxml')
div =soup.find('div',class_="tang")
print(div.find('a',class_='song'))
打印显示:
<a class="song" href="http://www.sina.com">杜甫</a>
[Finished in 0.4s]
print(soup.find('a',id='yuan'))显示内容为:
<a href="http://www.haha.com" id="yuan">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘</a>
[Finished in 0.4s]
5. find_all方法
soup.find_all('a')
soup.find_all(['a'.'b'])
soup.find_all('a',limit=2)限制前2个
lt=soup.find_all('a')
print(lt,len(lt))
打印内容为所有标签a 及数量8
[<a href="http://www.song.com/" target="_self" title="赵匡胤">宋朝是最强大的王朝,不是军队的强大。而是经济很强大,国民都很有钱</a>, <a class="song" href="">总为浮云能蔽日,长安不见使人愁</a>, <a href="http://www.baidu.com" title="qing">
清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指鲜花村</a>, <a href="http://www.163.com" title="qin">
秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a>, <a alt="tang" href="http://www.126.com">
气王宅里寻常见,催九堂前几度闻,正是江南好风景,落花时节又逢君</a>, <a class="song" href="http://www.sina.com">杜甫</a>, <a class="song" href="http://www.haha.com">杜牧</a>, <a href="http://www.haha.com" id="yuan">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘</a>] 8
[Finished in 0.4s]
另外查找方法:
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('soup_test.html',encoding='utf8'),'lxml')
div =soup.find('div',class_="tang")
print(div.find_all('a'))
显示:
[<a href="http://www.baidu.com" title="qing">
清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指鲜花村</a>, <a href="http://www.163.com" title="qin">
秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a>, <a alt="tang" href="http://www.126.com">
气王宅里寻常见,催九堂前几度闻,正是江南好风景,落花时节又逢君</a>, <a class="song" href="http://www.sina.com">杜甫</a>, <a class="song" href="http://www.haha.com">杜牧</a>, <a href="http://www.haha.com" id="yuan">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘</a>]
[Finished in 0.4s]
- 可以打印a标签和b标签
div =soup.find('div',class_="tang")
print(div.find_all(['a','b']))
显示:
[<a href="http://www.baidu.com" title="qing">
清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指鲜花村</a>, <a href="http://www.163.com" title="qin">
秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a>, <a alt="tang" href="http://www.126.com">
气王宅里寻常见,催九堂前几度闻,正是江南好风景,落花时节又逢君</a>, <a class="song" href="http://www.sina.com">杜甫</a>, <a class="song" href="http://www.haha.com">杜牧</a>, <b>杜小月</b>, <a href="http://www.haha.com" id="yuan">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘</a>]
[Finished in 0.4s]
- 找到所有a标签只选前2个
div =soup.find('div',class_="tang")
print(div.find_all('a',limit = 2))
显示:
[<a href="http://www.baidu.com" title="qing">
清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指鲜花村</a>, <a href="http://www.163.com" title="qin">
秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a>]
[Finished in 0.4s]
6. select方法
select选择器返回的永远是一个列表,需要通过下标提取指定的
对象,获取属性和节点
该方法也可以通过普通对象调用,找到都是这个对象下面符合要求的所有节点
- 根据选择器选择指定的内容
常见的选择器:标签选择器,类选择器,id选择器,组合选择器,层级选择器,伪类选择器,属性选择器
a 标签选择器
.dudu 类选择器
井号lala(#lala) id选择器
a, .duu, #lala, .meme 组合选择器
div空格,dudu空格#lala空格.meme空格,xixi层级选择器---》没有要求,下面好多级
div > p > a >.lala只能是下面一级
input[name='lala']属性选择器
类tang下面标签ul下面li下面的所有a标签,返回的是一个列表
print(soup.select('.tang > ul > li > a'))
显示:
[<a href="http://www.baidu.com" title="qing">
清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指鲜花村</a>, <a href="http://www.163.com" title="qin">
秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a>, <a alt="tang" href="http://www.126.com">
气王宅里寻常见,催九堂前几度闻,正是江南好风景,落花时节又逢君</a>, <a class="song" href="http://www.sina.com">杜甫</a>, <a class="song" href="http://www.haha.com">杜牧</a>, <a href="http://www.haha.com" id="yuan">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘</a>]
[Finished in 0.4s]
如果想显示第三个string
print(soup.select('.tang > ul > li > a')[2])
显示:
<a alt="tang" href="http://www.126.com">
气王宅里寻常见,催九堂前几度闻,正是江南好风景,落花时节又逢君</a>
[Finished in 0.4s]
如果想通过ID查找,返回的是一个列表
print(soup.select('#yuan'))
显示:
[<a href="http://www.haha.com" id="yuan">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘</a>]
[Finished in 0.4s]
如果想获取这个列表的汉字内容
print(soup.select('#yuan')[0].text)
凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,近代衣冠成古丘
[Finished in 0.4s]
如果想获取href
print(soup.select('#yuan')[0]['href'])
http://www.haha.com
[Finished in 0.4s]
普通对象使用select
div =soup.find('div',class_="tang")
print(div.select('.song'))
[<a class="song" href="http://www.sina.com">杜甫</a>, <a class="song" href="http://www.haha.com">杜牧</a>]
[Finished in 0.4s]
网友评论