1、安装模块
目前Beautiful Soup的最新版本是4.x,之前的版本已经停止开发了,所以这里推荐使用beautifulsoup4。
pip3 install beautifulsoup4
2、安装beautifulsoup解析器
Beautiful Soup的HTML和XML解析器是依赖于lxml库的,所以在使用之前先安装lxml库,推荐使用lxml作为解析器,因为效率更高。
pip3 install lxml
3、创建beautifulsoup对象
from bs4 import beautifulsoup
resp = urllib.request.urlopen(url)
html = resp.read()
bs = beautifulsoup(html,'lxml')
print(bs.prettify()) #格式化html结构,更加美化层次。
4、使用标签获取内容信息
print(bs.title) #单独获取title标签
print(bs.title.string) #获取title标签里面的内容。
print(bs.a) #获取第1个出现a标签的信息,其它a标签不显示
print(bs.a.name) #获取a标签的名字,也就是“a”
print(bs.a.attrs) #获取a标签后面的属性如:'href': 'https://www.baidu.com',他是一个字典。
print(bs.a.attrs['href']) #获取标签属性里面的某一个值时,可以使用字典取值法。
print(bs.a.string) #获取标签尖挎号之间的字符串内容。
5、find_all(name,attrs,recursive,string,**kwargs)
name:对“标签名”进行检索
attrs:对“标签的属性值”进行检索。
recursive:是否对子孙进行检索,默认是True。
string:<>...</>中字符串区域的“字符串”进行检索。
print(bs.find_all(id="content_views")) #根据标签的ID进行检索。
# print(bs.find_all(string='web')) #可以检索字符串是否存在。
6、CSS选择器,select
(1)id选择器需要使用#来定位元素,如果想获取标签中含有id='list-2',那可以使用select(#list-2)来定位。
(2)类选择器使用.来定位元素,例如:获取所有的ul标签.list
(3)标签选择器,使用标签来选择,例如获取h4标签,直接h4
(4)混合使用获取第一个ul中的li节点,.panel-body #list-1 li
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">]ay</li>
</ul>
<ul class="list list-small" id="list-2">
<li class="element"> Foo</li>
<li class="element">Bar</li>
</ul>
</div>
</div>
'''
soup = BeautifulSoup(html, 'lxml')
print(soup.select('.panel .panel-heading')) #获取类标签panel-heading的div。
print(soup.select('ul li')) #获取所有的li节点
print(soup.select('#list-2 .element')) #获取id为list-2标签的,而且下面类名为element节点。
print(type(soup.select('ul')[0])) #获取第二个ul节点
7、CSS的高级嵌套方法
for ul in soup.select('ul'): #先选择一个节点,再获取这个节点下面的子节点。
print(ul.select('li'))
for li in soup.select("#list-2 li"): #获取属性。
print(type(li))
print(li.attrs)
print(li.attrs['class'])
for ul in soup.select("#list-2"):
print(type(ul))
print(ul.strings)
print(list(ul.strings)) #['\n', ' Foo', '\n', 'Bar', '\n']