BeautifulSoup
BeautifulSoup
安装方法: pip install beautifulsoup4
pip install beautifulsoup4
解析库
| 解析器 | 使用方法 | 优势 | 劣势 |
|---|---|---|---|
| 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语言库 |
| html5lib | BeautifulSoup(markup, "html5lib") | 最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 | 速度慢、不依赖外部扩展 |
bs4进行数据解析
数据解析的原理: 1、标签定位 2、提取标签、标签属性中存储的数据值
bs4数据解析的原理: 1、实例化一个BeautifulSoup对象,并且将页面源码加载到该对象中 2、通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取
如何实例化BeautifulSoup对象:
from bs4 import BeautifulSoup
对象的实例化:
1、将本地中的html文档中的数据加载到该对象中
fp=open('./test.html','r',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
2、将互联网上获取的页面源码加载到该对象中:
page_text=response.text
soup=BeautifulSoup(page_text,'lxml')
from bs4 import BeautifulSoup
fp=open('./test.html','r',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
提供的用于数据解析的方法和属性
1、soup.tagname:返回的是文档中第一次出现的tagname对应的标签
2、soup.find(): -find('tagname'):等同于soup.tagname
-属性定位:
-soup.find('div',class_/id/attr='song')
3、soup.find_all('tagname'):返回符合要求的所有标签(列表)
print(soup.div)
<div>
<p>百里守约</p>
</div>
print(soup.find('div'))
<div>
<p>百里守约</p>
</div>
print(soup.find('div',class_='song'))
<div class="song">
<p>李清照</p>
<p>王安石</p>
<p>苏轼</p>
<p>柳宗元</p>
<a href="http://www.song.com/" target="_self" title="赵匡胤">
<span>this is span</span>
宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a>
<a class="du" href="">总为浮云能蔽日,长安不见使人愁</a>
<img alt="" src="http://www.baidu.com/meinv.jpg"/>
</div>
print(soup.find_all('div'))
[<div>
<p>百里守约</p>
</div>, <div class="song">
<p>李清照</p>
<p>王安石</p>
<p>苏轼</p>
<p>柳宗元</p>
<a href="http://www.song.com/" target="_self" title="赵匡胤">
<span>this is span</span>
宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a>
<a class="du" href="">总为浮云能蔽日,长安不见使人愁</a>
<img alt="" src="http://www.baidu.com/meinv.jpg"/>
</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 alt="qi" href="http://www.126.com">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li>
<li><a class="du" href="http://www.sina.com">杜甫</a></li>
<li><a class="du" href="http://www.dudu.com">杜牧</a></li>
<li><b>杜小月</b></li>
<li><i>度蜜月</i></li>
<li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li>
</ul>
</div>]
CSS选择器 select
通过select()直接传入CSS选择器即可完成选择
1、select('某种选择器(id,class,标签...选择器)'),返回的是一个列表
2、层级选择器:
-soup.select(''):>表示的是一个层级
-soup.select():空格标示的是多个层级
html='''
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>
</div>
</div>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.select('.panel .panel-heading'))
print(soup.select('ul li'))
print(soup.select('#list-2 .element')) #id加#,class加.,标签名什么不加
print(soup.select('ul')[0])
[<div class="panel-heading">
<h4>Hello</h4>
</div>]
[<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>, <li class="element">Foo</li>, <li class="element">Bar</li>]
[<li class="element">Foo</li>, <li class="element">Bar</li>]
<ul class="list" id="list-1">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
from bs4 import BeautifulSoup
fp=open('./test.html','r',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
# print(soup.select('.tang'))
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="qi" href="http://www.126.com">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a>, <a class="du" href="http://www.sina.com">杜甫</a>, <a class="du" href="http://www.dudu.com">杜牧</a>, <a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a>]
from bs4 import BeautifulSoup
fp=open('./test.html','r',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
print(soup.select('.tang>ul a'))
[<a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a>, <a href="http://www.163.com" title="qin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a>, <a alt="qi" href="http://www.126.com">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a>, <a class="du" href="http://www.sina.com">杜甫</a>, <a class="du" href="http://www.dudu.com">杜牧</a>, <a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a>]
获取标签之间的文本数据
1、soup.a.text/string/get_text()
-text/get_text():可以获取一个标签中所有的文本内容
-string:只可以获取该标签下面直系的文本内容
from bs4 import BeautifulSoup
fp=open('./test.html','r',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
print(soup.select('.tang>ul a')[0].text)
print(soup.select('.tang>ul')[0].text)
清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村
清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村
秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山
岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君
杜甫
杜牧
杜小月
度蜜月
凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘
获取标签中的属性值
soup.a['href']
from bs4 import BeautifulSoup
fp=open('./test.html','r',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
print(soup.select('.tang>ul a')[0]['href'])
http://www.baidu.com

浙公网安备 33010602011771号