- 灵活方便的网页解析库,处理高效,支持多种解析器
- 是python的一个库,通过解析文档为用户提供需要抓取的数据
- 自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。
- 不用编写复杂的正则表达式提取网页信息(代替正则)
安装:
pip35 install beautifulsoup4
pip35 install lxml
# lxml解析器更加强大,速度更快
pip35 install html5lib
创建 Beautiful Soup 对象
soup = BeautifulSoup(html)
# 用本地HTML文件来创建对象
# soup = BeautifulSoup(open('demo.html'))
<!--打印soup对象的内容-->
print(soup.prettify())
<!--选择了title标签,将内容打印出来-->
print(soup.title.string)
常用的解析方法
标签选择器
选择元素
soup = BeautifulSoup(html, 'lxml')
<!--print(soup.prettify())-->
print(soup.title.string)
print(soup.title)
# 输出第一个返回结果
<!--获取名称-->
print(soup.p.string)
输出:
Title
<title>Title</title>
change the world by program
获取属性
soup = BeautifulSoup(html, 'lxml')
print(soup.p.attrs['name'])
print(soup.p['name'])
输出:
aaa
aaa
获取子节点
<!--获取p标签的子节点-->
<p class="story" name="aaa">change the world by program
<a>aaaaaaaaaaaaaaaaaaa</a>
<a>bbbbbbbbbbbbbbbbb</a>
<a>ccccccccccccccccc</a>
</p>
<!--列表类型-->
soup = BeautifulSoup(html, 'lxml')
print(soup.p.contents)
输出:
['change the world by program\n ', <a>aaaaaaaaaaaaaaaaaaa</a>, '\n', <a>bbbbbbbbbbbbbbbbb</a>, '\n', <a>ccccccccccccccccc</a>, '\n']
返回迭代器类型:
soup = BeautifulSoup(html, 'lxml')
print(soup.p.children)
for i, child in enumerate(soup.p.children):
print(i, child)
输出:
0 change the world by program
1 <a>aaaaaaaaaaaaaaaaaaa</a>
2
3 <a>bbbbbbbbbbbbbbbbb</a>
4
5 <a>ccccccccccccccccc</a>
6
子孙节点
soup = BeautifulSoup(html, 'lxml')
print(soup.p.descendants)
for i, child in enumerate(soup.p.descendants):
print(i, child)
输出:
0 change the world by program
1 <a>aaaaaaaaaaaaaaaaaaa</a>
2 aaaaaaaaaaaaaaaaaaa
3
4 <a>bbbbbbbbbbbbbbbbb</a>
5 bbbbbbbbbbbbbbbbb
6
7 <a>ccccccccccccccccc</a>
8 ccccccccccccccccc
9
父节点和祖先节点
- 父节点:parent
- 祖先节点: parents
- 兄弟节点:next_siblings
- previous_siblings
标准选择器
html = '''
<div class="panel">
<ul class="list" id="list1" name="elements">
<li class="element">aaa</li>
<li class="element">bbb</li>
<li class="element">ccc</li>
</ul>
<ul class="list list-small" id="list2">
<li class="element">111</li>
<li class="element">222</li>
</ul>
</div>
'''
name
soup = BeautifulSoup(html, 'lxml')
<!--注:ul必须与标签名一致-->
for ul in soup.find_all('ul'):
print(ul.find_all('li'))
输出:
[<li class="element">aaa</li>, <li class="element">bbb</li>, <li class="element">ccc</li>]
[<li class="element">111</li>, <li class="element">222</li>]
attr
通过属性名获取元素:
print(soup.find_all(attrs={'id': 'list1'}))
print(soup.find_all(attrs={'name': 'elements'}))
输出:
[<ul class="list" id="list1" name="elements">
<li class="element">aaa</li>
<li class="element">bbb</li>
<li class="element">ccc</li>
</ul>]
也可以直接获取:
print(soup.find_all(id='list1'))
print(soup.find_all(class_='element'))
text
print(soup.find_all(text='111'))
find
返回单个元素,find_all返回所有元素
css选择器
print(soup.select('.panel #list1'))
<!--输出第一个ul-->
获取属性
for ul in soup.select('ul'):
print(ul['id'])
print(ul.attrs['id'])
获取内容
for li in soup.select('li'):
print(li.get_text())
输出:
aaa
bbb
ccc
111
222