坛友Sirabbas分享了一本epub词典,想找人转成mdx。这部小词典用Emeditor处理不难。我这里是拿来练手,让AI写程序帮忙实现。
操作步骤:
1、观察词典结构
epub 词典之间的标签结构千差万别,没有统一的标准,因此很难找到万能的程序一步到位。通常都要具体情况具体分析。
从 Webster's Essential 1000 Words Dictionary 下载 epub 附件。解压 epub,把需要处理的 html 源文件复制到一个子文件夹中备用。
用 Calibre 打开 epub 文件,在元素查看器中观察元素标签,以及它们之间的位置关系。
更详细的步骤,点击展开
- 用 Calibre e-book viewer 打开该词典的 epub 文档。
- 翻到词典正文部分,用右键菜单唤出“元素查看器”
- 激活元素选择按钮(或者用快捷键Ctrl + shift + C),用鼠标点选词典正文的单词词头。查看器会自动展开相应位置的文档源码。
有的词典冗余的东西比较多,适合针对特定标签提取。有的结构相对简单,可以直接切割。这里选用提取法(有点像网页爬虫),找到要提取的标签p.nonindent
,p.border
,p.hang_9
和p.indent
,发现它们都是<body>
的一级子元素。顺便记下词头<b>
所在位置,后面会用到。
2、描述处理过程
想象自己是一台机器,拿到上面待处理的源文件和标签名后,要怎么一步步处理?(具体要怎么读取输入文件,怎么写入输出文件?) 把整个过程用文字描述出来,发给AI:
AI(此处为必应)会根据描述自动生成相应代码,并附有详细注释:
# 导入必要的库
import os
import codecs
from bs4 import BeautifulSoup
# 定义一个函数,用于处理每个xhtml文件
def process_file(filename):
# 用codecs打开文件,并用BeautifulSoup解析为html对象
with codecs.open(filename, "r", "utf-8") as f:
html = BeautifulSoup(f.read(), "html.parser")
# 找到body标签的一级子元素,并遍历它们
children = html.body.findChildren(recursive=False)
for child in children:
# 如果是p.nonindent标签,就把它里面的第一个b标签文本写入output.txt,换行,然后用html的link标签引入外部文件w.css,再将p.nonindent写在这个link后面
if child.name == "p" and child.has_attr("class") and "nonindent" in child["class"]:
b_text = child.b.get_text()
output.write(b_text + "\n")
link_tag = '<link rel="stylesheet" href="w.css">\n'
output.write(link_tag)
output.write(str(child) + "\n")
# 如果是p.border,p.hang_9和p.indent标签,就将其写入output.txt
elif child.name == "p" and child.has_attr("class") and any(x in child["class"] for x in ["border", "hang_9", "indent"]):
output.write(str(child) + "\n")
# 如果下一个元素是p.nonindent或者没有其它标签时,将文本</>写入(不要转义)
next_sibling = child.find_next_sibling()
if next_sibling is None or (next_sibling.name == "p" and next_sibling.has_attr("class") and "nonindent" in next_sibling["class"]):
output.write("</>\n")
# 定义当前文件夹的子文件夹w的路径
subfolder_path = os.path.join(os.getcwd(), "w")
# 创建一个空的output.txt文件,并以追加模式打开
output = open("output.txt", "a")
# 遍历子文件夹w中的所有xhtml文件,并调用process_file函数处理每个文件
for file in os.listdir(subfolder_path):
if file.endswith(".xhtml"):
file_path = os.path.join(subfolder_path, file)
process_file(file_path)
# 关闭output.txt文件
output.close()
3、执行代码并检查结果
把AI生成的代码复制另存为 xxx.py,放到与 html 源文件所在子文件夹同级的目录中。
打开终端执行:
python xxx.py
若程序执行无误,会按描述将结果保存到 output.txt,打开这个文本文件:
检查发现,这个处理结果基本符合预期。只要把第一行的</>
删除即可
若处理结果不符合预期,需要检查文字描述是否准确。
最后将 output.txt 打包成 mdx,其他素材比如图片和字体打包成 mdd。*打包过程略,可搜索其他教程。
成品mdx及效果:
mdx&mdd.zip (197.9 KB)
个人经验和心得:
-
同样的文字不是每次都能生成一样的代码,有的代码执行效率很高,有的却很慢。如果对生成的结果不满意,可以尝试刷新页面或重置话题。
-
生成的代码执行出错时,可以改变部分用词,调整先后顺序再试。也可以请AI用它自己的话复述一遍问题,通过对比它复述的内容和你的原话之间的差别,会发现问题所在。理论上只要描述得足够清楚,就可以生成不错的代码。
-
对处理结果,有时候手动编辑一两个细节比调整文字描述更快捷。并不是所有操作都一定要用AI完成。语言描述太简略会处理不到位,太详细又可能会扰乱整体的逻辑脉络。有点考验一个人的逻辑和表达能力。
这个方法门槛不高。只要大致梳理一下流程,就可以生成堪用的程序。比较适合对html和编程有基本了解,想入门但一直没能迈开实战第一步的人。