Beautiful Soup实战案例:爬取"诗词名句网"
目标
爬取"诗词名句网"上的古典文学作品内容,包括书籍目录和章节内容,并将每章内容独立保存为文本文件。
目标网址: 《三国演义》全集在线阅读_史书典籍_诗词名句网
要求
-
书籍目录管理:目录名基于书籍名称动态生成
-
目录页解析: 下载书籍目录页HTML、解析章节列表结构
-
章节信息提取: 构建完整章节URL(基础URL + 相对路径)
-
章节内容获取: 下载各章节HTML内容
-
内容提取与处理: BS作为主要解析器、提取纯文本内容(去除HTML标签)
-
文件存储规范: 文件名安全处理、使用章节名称作为文件名
-
进度反馈: 目录创建成功通知 、文件写入成功确认等
代码
python
import requests
from bs4 import BeautifulSoup
import re
import os
from urllib.parse import urljoin
# 创建目录
if not os.path.exists('三国演义'):
os.mkdir('三国演义')
# 目标网址
url = 'https://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/138.0.0.0 Safari/537.36 Edg/138.0.0.0'
}
# 发送请求,获取响应
response = requests.get(url, headers=headers)
# 进行编码
response.encoding = 'utf-8'
# 转成html对象,从而提取数据
html = BeautifulSoup(response.text,'lxml')
# 得到对象
tablis = html.select('a[class="tabli"]')
# 循环提取数据
for tabli in tablis:
my_dict = {
'章节名称':'',
'详情页地址':''
}
tabli_name = tabli.get_text().strip()
if tabli_name:
# 将章节名称进行特殊符号的替换
safe_name = re.sub(r'[\\/*?<|>]','',tabli_name)
my_dict['章节名称'] = safe_name
tabli_href = tabli.attrs.get('href')
if tabli_href:
# 建立完整的url地址
new_href = urljoin('https://www.shicimingju.com/',tabli_href)
my_dict['详情页地址'] = new_href
# 发送二次请求,获取详情内容
response_content = requests.get(new_href,headers=headers)
response_content.encoding = 'utf-8'
# 转成html格式
content_html = BeautifulSoup(response_content.text,'lxml')
# 获取文本对象
div_content = content_html.select('div[class="text p_pad"]')
# 提取文章内容
content = div_content[0].get_text()
# 写入文件
file_name = f'{safe_name}.txt'
with open(os.path.join('三国演义',file_name),'w',encoding='utf-8') as f:
f.write(content)
print(my_dict)