文章目录
一.BeautifulSoup库的介绍
- BeautifulSoup也是一个解析库
- BS解析数据是依赖解析器的, BS支持的解析器有html.parser, lxml, xml, html5lib等, 其中lxml解析器解析速度快, 容错能力强。
- BS现阶段应用的解析器多数是lxml
二.BeautifulSoup库的使用方法
from bs4 import BeautifulSoup
# 实例化bs4对象
soup = BeautifulSoup(res.text, 'lxml')
# bs4解析出来的结果会是一个列表
tag = soup.select("CSS选择器表达式")
三.BeautifulSoup库的语法
# CSS选择器:
1.根据节点名及节点层次关系定位标签: 标签选择器 & 层级选择器
soup.select('title')
soup.select('div > ul > li') # 单层级选择器
soup.select('div li') # 多层级选择器
2.根据节点的class属性定位标签: class选择器
soup.select('.panel')
3.根据id属性定位标签: id选择器
soup.select('#item')
4.嵌套选择: 对解析的结果再次进行解析
ul_list = soup.select('ul')
for ul in ul_list:
print(ul.select('li'))
# 获取节点的文本或属性:
# tag_obj是解析后赋值的变量
tag_obj.string: 获取直接子文本-->如果节点内有与直系文本平行的节点, 该方法拿到的是None
tag_obj.get_text(): 获取子孙节点的所有文本
tag_obj['attribute']: 获取节点属性
四.爬取数据, 并使用BeautifulSoup解析
1).分析页面, 制定爬虫的流程
今天要爬取的页面是诗词名句网中的小说《三国演义》
- 确认url, 我们首先要对小说的列表页进行爬取
列表页链接 - 分析列表页, 从列表页中拿取详情页的链接
- 对详情页的地址进行拼接, 同时请求详情页
- 对详情页面的响应进行解析
- 写入文件
2).编写爬虫的代码并解析数据
import time
import requests
from bs4 import BeautifulSoup
# 构造存储小说的路径, 需要自己先创建一个文件夹
FICTION_PATH = "./fictions/"
def spider_fiction():
"""
1.爬取三国演义
"""
start_time = time.time()
url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
# 定制请求头信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
"Chrome/74.0.3729.108 Safari/537.36",
}
# 使用当前地址去请求,获取响应到的列表页
response_list_page = requests.get(url=url, headers=headers)
# 对响应到的列表页进行解析,使用lxml解析器
soup = BeautifulSoup(response_list_page.text, 'lxml')
# 进行解析获取所有的回合超链接, 超链接都在a标签内
a_list = soup.select('.book-mulu ul li a')
for a in a_list:
# 下面只有子节点, 所以使用string
name = a.string
# 获取详情页地址的同时将地址拼接
href = 'http://www.shicimingju.com' + a['href']
# 使用获取到的href来访问详情页
response_detail_page = requests.get(url=href, headers=headers)
# 获取到详情页的数据首先需要根据数据实例化BeautifulSoup类
soup_detail = BeautifulSoup(response_detail_page.text, 'lxml')
# 使用实例化的对象来进行数据解析
p_list = soup_detail.select('.chapter_content p')
# 获取到一回合的所有内容后需要将数据正常写入到文件内
with open(FICTION_PATH + name + '.txt', 'w', encoding='utf-8') as f:
# 因为解析出来的数据是一个列表,所以要循环遍历
for p in p_list:
# python2中的写入文件方法,在python3需要加上file=文件句柄,print自带换行
print(p.string, file=f)
# 或者使用write
# f.write(p.string + "\n")
end_time = time.time()
# 测试写入文件总用时时间
print(end_time-start_time)
if __name__ == '__main__':
spider_fiction()
五.总结
bs4是纯python编写的解析库, 解析速度相对于xpath来说要慢(xpath底层是C编写的), 所以还是推荐大家使用xpath, 不过bs4最好也要会使用.
xpath解析的文章