BeautifulSoup和 lxml 一样都是html的解析器,效率相比于xpath来说较低。
BeautifulSoup默认打开的编码是gbk。
<!D<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Title</title>
</head>
<body>
<ul>
<li id="l1">zhangsan</li>
<li id="l2">lisi</li>
<li>wangwu</li>
<a href="" id="" class="a2">weinianhuan</a>
</ul>
<a href="" title="a1">www</a>
</body>
</html>
1.导入本地html文件
soup = BeautifulSoup(open('test.html', encoding='utf-8'), 'lxml')
2.根据标签来找节点
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('test.html', encoding='utf-8'), 'lxml')
print(soup.a) # 找到的是第一个符合条件的数据
print(soup.a.attrs) # attrs返回标签的属性和其值
# <a href="" id="">weinianhuan</a>
# {'href': '', 'id': ''}
3.bs4的函数
(1)find
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('test.html', encoding='utf-8'), 'lxml')
print(soup.find('a')) # 返回第一个符合条件的数据
# <a href="" id="">weinianhuan</a>
'''
给test.html第二个a标签里加上一个title=a1
'''
print(soup.find('a', title="a1"))
# <a href="" title="a1">www</a>
如果要根据class的值来找标签,需要在class后加下划线【class_】
(2)find_all
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('test.html', encoding='utf-8'), 'lxml')
print(soup.find_all('a')) # 以列表的形式返回所有符合条件的数据
# [<a href="" id="">weinianhuan</a>, <a href="" title="a1">www</a>]
# find_all第二种用法
print(soup.find_all(['a', 'li'])) # 以列表的形式返回所有符合条件的数据
# [<li>zhangsan</li>, <li>lisi</li>, <li>wangwu</li>, <a href="" id="">weinianhuan</a>, <a href="" title="a1">www</a>]
# limit是查找的数量
print(soup.find_all('li', limit=2))
# [<li>zhangsan</li>, <li>lisi</li>]
(3)select【使用较多】
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('test.html', encoding='utf-8'), 'lxml')
print(soup.select('a')) # select以列表形式返回多个a标签
# [<a href="" id="">weinianhuan</a>, <a href="" title="a1">www</a>]
# 给test.html的第一个a中加上class="a2"
print(soup.select('.a2'))
# [<a class="a2" href="" id="">weinianhuan</a>]
# 给test.html的第一个li中加上id="l1"
print(soup.select('#l1'))
# [<li id="l1">zhangsan</li>]
# 再给test.html的第二个li中加上id="l2"--属性选择器
# 查找li标签中有id的标签
print(soup.select('li[id]'))
# [<li id="l1">zhangsan</li>, <li id="l2">lisi</li>]
加载服务器响应文件
soup = BeautifulSoup(response.read().decode('utf-8'), 'lxml')