一部章回小说从网上下载到离线阅读的整理过程

本文介绍了一部名为《天下》的历史小说从网上下载到离线阅读的整理步骤,包括删除空行、清理多余信息、修正标题格式等过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一部章回小说从网上下载到离线阅读的整理过程

   

          最近,我用java小说爬取工具从网上下载了一部名叫《天下》的长篇历史小说。这部小分共分七百一十章。我把它保存为test.txt,图片保存为tianxia.bmp。


        从网上下载的小说,往往编排不规范,需要重新进行编排。下面以这部小说为例,谈谈我对它的整理过程。
        1、删除空行。
        打开排版助手,点“文件”/“打开”,打开test.txt,点“执行”命令,开始整理段落,我将整理后的文本保存为test001.txt,截图保存为tianxia001.bmp。


        2、删除多余的网址“www.lingdiankanshu.com”。
        打开EmEditor,点“搜索”/“替换”,在“查找”里输入“www.lingdiankanshu.com”,在“替换为”里无输入,勾选“使用正则表达式”和“匹配整个单词”前面的复选框,点“全部替换”,文本中多余的网址全部被删除。删除后的文本保存为test002.txt,截图保存为tianxia002.bmp。


        3、删除多余的字符串“*****”。
        打开EmEditor,点“搜索”/“替换”,在“查找”里输入“*****”,在“替换为”里输入“
”,勾选“使用转义序列”前面的复选框,点“全部替换”,记事本提示已替换52936个字符。替换后的文本保存为test003.txt,截图保存为tianxia003.bmp。


        4、替换转义符“
”,。
        打开test003.txt,点“搜索”/“替换”,在“查找”里输入“
”,在“替换为”里输入“\n    ”,勾选“使用正则表达式”前面的复选框,点“全部替换”,记事本提示已替换52936个字符。替换后的文本保存为test004.txt,截图保存为tianxia004.bmp。


        5、删除“正文”二字。
        打开test004.txt,点“搜索”/“替换”,在“查找”里输入“    正文  第”,在“替换为”里输入“第”,勾选“使用正则表达式”和“匹配整个单词”前面的复选框,点“全部替换”,记事本提示已替换706个字符。替换后的文本保存为test005.txt,截图保存为tianxia005.bmp。


        6、删除各章题前的“第”字。
        打开test005.txt,点“搜索”/“替换”,在“查找”里输入“    第”,在“替换为”里输入“第”,勾选“使用正则表达式”和“匹配整个单词”前面的复选框,点“全部替换”,记事本提示已替换629个字符,各章标题行已无空格,全部左对齐。替换后的文本保存为test006.txt,截图保存为tianxia006.bmp。


        7、在各章标题行空格处添加“zhang”字符串。
       打开test006.txt,点“搜索”/“替换”,在“查找”里输入“章”,在“替换为”里输入“章 zhang”,勾选“使用正则表达式”和“匹配整个单词”前面的复选框,点“全部替换”,记事本提示已替换的字符串数。替换后的文本保存为test007.txt,截图保存为tianxia007.bmp。


        8、删除各章标题中的“zhang”。
        打开test007.txt,点“搜索”/“替换”,在“查找”里输入“([^a-z]) +([a-z])”,在“替换为”里输入“\1\r\2”,勾选“使用正则表达式”前面的复选框,点“全部替换”,记事本提示已替换1527个字符串。替换后的文本保存为test008.txt,截图保存为tianxia008.bmp。


        9、删除“zhang”后面的空格。
        打开test008.txt,点“搜索”/“替换”,在“查找”里输入“zhang\s*”,在“替换为”里输入“zhang”,勾选“使用正则表达式”和“匹配整个单词”前面的复选框,点“全部替换”,记事本提示已替换1214个字符串。替换后的文本保存为test009.txt,截图保存为tianxia009.bmp。


        10、删除“zhang”后面的空格。
        打开test009.txt,点“搜索”/“替换”,在“查找”里输入“zhang”,在“替换为”里输入“”,勾选“使用正则表达式”和“匹配整个单词”前面的复选框,点“全部替换”,记事本提示已替换的字符串数。替换后的文本保存为test010.txt,截图保存为tianxia010.bmp。


        11、删除内容重复的标题行。
        在PilotEdit中,打开test010.txt,点选“排序和查找/删除重复的行”,在弹出的“排序和查找/删除重复的行”对话框中点“删除重复的行”按钮,内容重复的标题行即被合并为一个标题行。合并标题后的文本保存为test011.txt,截图保存为tianxia011.bmp。

        12、提取目录。
        打开F:\mulu001文件夹,将test011.txt复制到F:\mulu001根目录下,并重新将其命名为shenmu.txt。运行“test.bat”,java这个目录提取工具开始从shenmu.txt文本里把小说各个章节的题目提取到cmd界面,然后通过复制粘贴,将提取的目录保存为test012.txt。
        13、将提取的目录制作成cnt格式的目录文件。
        打开“test012.txt”,删除与目录无关的行,选择“文件”中的另存为,在文件名称里输入“天下.cnt”,点保存即可。
        14、在各章节标题前添加##字符串。
        运行EmEditor,打开test011.txt,点“搜索”/“替换”,在“查找”里输入“第.+[章]\s\n”,在“替换为”里输入“##\0”,勾选“使用正则表达式”前面的复选框,点“全部替换”,记事本中各章节标题前已添加了##字符串。替换后的文本保存为test015.txt,截图保存为tianxia015.bmp。

 


        15、删除##,将“##”替换为分隔符。
        打开test015.txt,点“搜索”/“替换”,在“查找”里输入“##”,在“替换为”里输入“*\n(无注释)\n*\n”,勾选“使用正则表达式”前面的复选框,点“全部替换”,记事本中各章节标题前已分三行分别添加了“*”、“(无注释)”、“*”为一组的字符串。替换后的文本保存为test016.txt,截图保存为tianxia016.bmp。


        16、开始分章阅读。
        复制“天下.cnt”和test016.txt到“D:\武臣文苑\电子书\分章阅读”文件夹,并将test016.txt重新命名为“天下.txt”。运行电子书,打开目录,左边“目录”列表框里弹出所选各章目录,右边“内容”文本框里弹出所选章节内容。
        17、检测目录和内容。
        有时,左边的所选目录与右边的内容名不符实,一是需要打开小说目录文件重新添加或删除目录,二是需要打开小说文本重新添加或删除文本中的分隔符。从头到尾,只要目录、内容、(无注释)三对应,整理工作即为成功。

 

 

<think>我们有一个任务:从小说文本文件中提取目录结构或章节列表。参考引用中提到了几种方法:[^1]:用Python爬取小说章节并保存为文本文件,但这里主要是关于网络爬虫和保存文件,与本地文件提取目录相关度不高。[^2]:C#提取小说中的目录,提到创建一个Catalog类,其中包含章节列表,并有一个构造函数从文本中提取。[^3]:用正则表达式(re模块)提取小说文本的章回目录,提供了一个Python示例代码,使用正则表达式匹配类似“第X回”的模式。根据用户需求,我们需要从本地文本文件(如.txt)中提取目录或章节信息。通常,目录或章节标题有特定的模式,比如:-以“第”开头,后跟数字和“回”或“章”,例如“第一回”、“第一章”-或者包含“卷”、“节”等我们可以采用正则表达式来匹配这些模式。步骤:1.读取文本文件。2.定义匹配章节标题的正则表达式模式。由于不同小说的章节标题格式可能不同,我们需要一个通用的模式,或者根据具体小说调整。常见的模式有:r'第[零一二三四五六七八九十百千\d]+\s*[章回节]'但为了更通用,我们可以考虑匹配“第”开头,后跟数字(包括汉字数字或阿拉伯数字)和“回”、“章”、“节”等,并且后面通常会有标题文字。3.使用正则表达式在文本中查找所有匹配的字符串,并记录它们的位置(行号或索引)以便后续处理。注意:有些小说在正文开始前可能有目录,也可能没有。我们可能需要跳过一些无关内容(如作者、前言等)。但第一步是提取所有可能的章节标题。我们将用Python实现,因为引用中提供了Python示例。示例代码思路(参考引用[^3]):-打开文件并读取全部内容。-使用正则表达式匹配章节标题行。-将匹配到的章节标题列表输出。但注意:有些章节标题可能跨行,或者在同一行有其他内容,所以我们需要确保模式能够准确匹配。改进:我们可以尝试匹配每一行(按行读取)或者在整个文本中搜索,然后记录每个匹配的位置。如果章节标题在单独一行,那么按行处理可能更简单。然而,用户提供的是文本文件,我们不知道具体格式。所以我们可以先尝试在整个文本中搜索,然后提取出章节标题。代码步骤:1.读取文件内容。2.定义一个正则表达式模式,例如:`pattern=re.compile(r'第\w+[章回]')`,但这样可能不够精确,因为“第”后面可能跟汉字数字,而`\w`可能匹配不到汉字数字(在Python的re模块中,`\w`可以匹配汉字,但要注意数字也可能用阿拉伯数字)。3.更健壮的模式:`r'第[零一二三四五六七八九十百千\d]+\s*[章回节]'`,但这样会漏掉一些使用其他格式的(比如“第1部分”),所以根据具体文本调整。考虑到通用性,我们可以先尝试一个简单的模式,然后根据结果调整。示例代码(参考引用[^3]):```pythonimportre#打开文件withopen('novel.txt','r',encoding='utf-8')asf:content=f.read()#定义模式:匹配“第”+任意字符(直到一个空格或换行?)但实际上我们想要的是整个标题直到换行?但通常章节标题是一行?#假设章节标题单独成行,我们可以按行处理,但这里先在整个文本中搜索。#模式1:匹配“第X章”或“第X回”等,后面跟着标题文字(直到换行)pattern=re.compile(r'第[零一二三四五六七八九十百千\d]+\s*[章回节][^\n]*')#或者更宽泛:r'第\S*\s*[章回节][^\n]*'#查找所有匹配chapters=pattern.findall(content)#打印结果fori,chapterinenumerate(chapters):print(f"{i+1}:{chapter}")```但是,如果章节标题不是以“第”开头怎么办?比如“卷首语”、“尾声”等?我们需要根据具体文本调整模式,或者使用多个模式。另一种思路:先观察文本文件,确定章节标题的模式,然后编写正则表达式。如果用户希望更通用,我们可以提供多个模式,或者允许用户自定义模式。由于问题中没有给出具体文本,我们假设常见的“第X章”格式。此外,我们可能希望不仅提取标题,还要提取每个章节的起始位置(如行号或字节偏移),以便构建目录结构。下面我们提供一个函数,它接收文件路径,返回章节标题列表,以及每个标题在文件中的起始行号(如果可能)。但是,行号需要按行读取。因此,我们可以修改为按行读取:```pythonimportredefextract_chapters(file_path):chapters=[]pattern=re.compile(r'第[零一二三四五六七八九十百千\d]+\s*[章回节][^\n]*')#或者更通用的模式:r'^(第\S*\s*[章回节].*)$'加上多行模式,这样可以从每行的开头匹配#我们使用按行读取,然后检查每一行withopen(file_path,'r',encoding='utf-8')asf:forline_num,lineinenumerate(f,1):#去除前后空白stripped_line=line.strip()#检查是否匹配模式ifpattern.match(stripped_line):chapters.append((line_num,stripped_line))returnchapters```但是,上面的模式使用`match`方法,要求整行匹配(从行首开始),但有时章节标题可能前面有空格,所以用`strip`后匹配行首。然而,有些章节标题可能不是从行首开始?比如缩进?所以我们可以用`search`在行内搜索,但这样可能匹配到正文中的章节标题引用(如“见第X章”)。因此,最好假设章节标题单独成行,并且以“第”开头。如果文本中章节标题前面有空格,我们可以用`strip`处理,然后检查是否以“第”开头。改进:我们允许用户传入正则表达式模式,以便自定义。最终,我们提供一个函数,默认使用一个常见模式,但允许用户自定义。代码:```pythonimportredefextract_chapters(file_path,pattern_str=None):"""从文本文件中提取章节标题。参数:file_path:文本文件路径pattern_str:可选,自定义的正则表达式模式字符串(用于匹配章节标题行)返回:列表,元素为元组(行号,标题文本)"""ifpattern_strisNone:#默认模式:匹配以“第”开头,后跟数字(汉字或阿拉伯数字)和“章”、“回”、“节”等,后面跟着标题文字pattern_str=r'^第[零一二三四五六七八九十百千\d]+\s*[章回节].*'pattern=re.compile(pattern_str)chapters=[]withopen(file_path,'r',encoding='utf-8')asf:forline_num,lineinenumerate(f,1):stripped_line=line.strip()ifpattern.match(stripped_line):chapters.append((line_num,stripped_line))returnchapters```使用示例:```pythonchapters=extract_chapters('novel.txt')forline_num,titleinchapters:print(f"行号:{line_num},标题:{title}")```如果默认模式匹配不全,用户可以根据自己的文件调整正则表达式。注意:编码问题,如果文件不是UTF-8,可能需要调整。另外,有些小说目录可能包含“卷”和“章”两级,我们可以扩展匹配模式,但一次匹配一级。或者我们匹配两级,这需要更复杂的正则表达式。作为基础,我们先提取一级目录。相关问题:1.如果章节标题不是单独一行怎么办?2.如何提取多级目录(卷、章、节)?3.如何将提取的目录与章节内容关联(如生成一个包含章节起始行和结束行的目录)?4.如何避免匹配到正文中的类似字符串(如“见第X章”)?因此,我们生成以下相关问题:§§相关问题§§1.如何调整正则表达式以适应不同格式的章节标题(例如包含“卷”、“部”等)?2.如果章节标题不是单独成行,而是与其他文字在同一行,如何准确提取?3.如何提取多级目录结构(例如同时包含卷和章)?4.如何避免匹配到正文中出现的章节标题(如“见第X章”)?</think>### 如何从小说文本文件中提取目录或章节信息 从文本文件中提取小说目录或章节信息,核心是通过模式识别定位章节标题。以下是具体方法和步骤: #### 方法 1:正则表达式匹配(推荐) 这是最高效的方式,通过正则表达式匹配章节标题的固定模式: ```python import re def extract_chapters(file_path): with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 匹配常见章节格式:第X章/回/节 + 标题 pattern = r'(第[零一二三四五六七八九十百千\d]+\s*[章节回])[^\n]*' chapters = re.findall(pattern, content) return chapters # 使用示例 chapters = extract_chapters("三国演义.txt") for idx, title in enumerate(chapters, 1): print(f"{idx}. {title}") ``` #### 方法 2:行扫描法 适用于章节标题单独成行的情况: ```python def scan_chapters(file_path): chapters = [] with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() # 检测章节行特征(含"第"和"章/回") if "第" in line and ("章" in line or "回" in line): chapters.append(line) return chapters ``` #### 方法 3:多级目录处理 针对包含卷/章/节的多级结构: ```python import re def extract_multilevel_chapters(file_path): with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 同时匹配卷和章 pattern = r'((?:第[卷]\S+?)?第[章节回]\S+)[^\n]*' return re.findall(pattern, content) ``` ### 关键注意事项 1. **模式优化**: - 基础模式:`r'第[\d零一二三四五六七八九十百千]+章'` - 扩展汉字数字:添加`零一二三四五六七八九十百千`到字符集 - 处理空格:`r'第\s*[\d]+\s*章'`兼容"第 1 章" 2. **编码处理**: ```python # 尝试不同编码防止乱码 encodings = ['utf-8', 'gbk', 'gb2312'] for enc in encodings: try: with open(file_path, 'r', encoding=enc) as f: return f.read() except UnicodeDecodeError: continue ``` 3. **结果验证**: ```python # 过滤误匹配(长度阈值) valid_chapters = [t for t in chapters if 5 <= len(t) <= 30] ``` ### 示例输出 对于《三国演义》文本,可能提取到: ``` 1. 第一回 宴桃园豪杰三结义 2. 第二回 张翼德怒鞭督邮 3. 第三回 议温明董卓叱丁原 ... ``` ### 应用场景 1. 自动生成电子书目录 2. 小说阅读器章节跳转功能 3. 文本结构分析工具[^3] > **提示**:不同小说的章节格式可能不同(如"Chapter 1"、"卷之一"等),需根据实际文本调整正则表达式。建议先用小样本测试匹配效果[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值