Beautiful Soup的安装,简称bs4
pip3 install bs4
bs4解析器选择
解析器 | 使用方法 | 优势 | 劣势 |
Python标准库 | BeautifulSoup(markup, "html.parser") | Python的内置标准库 执行速度适中 文档容错能力强 | Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差 |
lxml HTML 解析器 | BeautifulSoup(markup, "lxml") | 速度快 文档容错能力强 | 需要安装C语言库 |
lxml XML 解析器 | BeautifulSoup(markup, ["lxml-xml"]) BeautifulSoup(markup, "xml") | 速度快 唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, "html5lib") | 最好的容错性 以浏览器的方式解析文档 生成HTML5格式的文档 | 速度慢 不依赖外部扩展 |
官方推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定
lxml解析器安装
pip3 install lxml
使用bs4过滤器
自建示例文件scenery.html文件的内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>武汉旅游景点</title>
<meta name="description" content="武汉旅游景点 精简版" />
<meta name="author" content="hstking">
</head>
<body>
<div id="content">
<div class="title">
<h3>武汉景点</h3>
</div>
<ul class="table">
<li>景点<a>门票价格</a></li>
</ul>
<ul class="content">
<li nu="1">东湖 <a class="price">60</a></li>
<li nu="2">磨山 <a class="price">60</a></li>
<li nu="3">欢乐谷 <a class="price">108</a></li>
<li nu="4">武昌极地海洋世界 <a class="price">150</a></li>
<li nu="5">玛雅水上乐园 <a class="price">150</a></li>
</ul>
</div>
</body>
</html>
使用lxml解析器,打印scenery.html内容
from bs4 import BeautifulSoup
# 使用lxml解析器
soup = BeautifulSoup(open('scenery.html', encoding='utf8'), 'lxml')
# prettify按标准的缩进格式的结构输出
print(soup.prettify())
执行结果: 按照标准的缩进格式的结构输出
bs4解析器lxml练习:
#!/usr/bin/env python
# coding: utf-8
from bs4 import BeautifulSoup
# 使用lxml解析器
soup = BeautifulSoup(open('scenery.html', encoding='utf8'), 'lxml')
# prettify按标准的缩进格式的结构输出
print(soup.prettify())
# 获取第一次出现的标签名为ul的标签内容
print(soup.ul)
print('\n')
# 使用bs4过滤器soup.find()的方法获取第一次出现的标签内容
print(soup.find('ul'))
print('\n')
# 使用soup.find_all方法获取所有符合条件的标签列表,然后从列表中读取就行了
print(soup.find_all('ul')) # 获取所有ul中所有内容
print('\n')
print(soup.find_all('ul')[0]) # 获取第一个ul中的所有内容
print('\n')
print(soup.find_all('ul')[1]) # 获取第二个ul中的所有内容
print('\n')
# 可以用soup.find(TagName, attrs={attrName:attrValue})的方法获取Tag的位置
# 获取li标签nu='3'的内容,适用标签名相同,属性不同的标签
print(soup.find('li', attrs={'nu': '3'}))
print('\n')
# 标签名相同,属性相同,连属性值都相同的标签
# 可以用soup.find_all(TagName,attr={'attName':'attValue'})将符合条件的内容全部放到列表里面
# 找a标签,class='price'的第一个内容
print(soup.find_all('a', attrs={'class': 'price'})[0])
print('\n')
# 获取li标签,nu='2'的内容
Tags = soup.find('li', attrs={'nu': '2'})
print(Tags)
print(Tags.a) # 获取nu='2'里面的a标签内容
print(Tags.find('a')) # 获取nu='2'里面的a标签内容
print('\n')
# 获取li标签,nu='4'的内容
Tag = soup.find('li', attrs={'nu': '4'})
print(Tag)
# 获取li标签,nu='4'中nu的值
print(Tag.get('nu'))
# 获取li标签,nu='4'中的文本内容
ss = Tag.get_text()
print(ss)
# 以空格切割上面文本内容拿到第一个值
print(Tag.get_text().split(' ')[0])
# 获取li标签下a标签的文本内容
print(Tag.a.get_text())