缘起
上了几个月网课,存了上千行英语的笔记在幕布上,即将开学,得导出来带到学校以备不时之需。为了方便查阅,得按顺序导出。

准备
幕布的导出有五个格式:word,pdf,图片,html,opml
word,pdf,图片都不太行,html过于繁杂而我又不甚了解,看起来还是opml比较好操作
- html

- opml
<?xml version="1.0" encoding="UTF-8"?>
<opml version="2.0">
<head>
<title>英语纠错</title>
<hjs>ctbfl</hjs>
</head>
<body>
<outline text="辨析" _mubu_text="%E7%9B%AF%E7%9D%80%E7%B3%BB%E5%88%97">
<outline text="stare at" _mubu_text="stare%20at">
<outline text="盯着" _mubu_text="%E7%9B%AF%E7%9D%80">
</outline>
</outline>
<outline text="glare at" _mubu_text="glare%20at">
<outline text=" 怒目而视" _mubu_text="%20%E6%80%92%E7%9B%AE%E8%80%8C%E8%A7%86">
</outline>
</outline>
<outline text="glance at " _mubu_text="glance%20at%20">
<outline text="瞥了一眼" _mubu_text="%E7%9E%A5%E4%BA%86%E4%B8%80%E7%9C%BC">
</outline>
</outline>
</outline>
</body>
</opml>
搜索了一下,关于opml的东西有点少,所幸找到了一个python库,年代有些久远,但能用就好。
opml 0.5:https://pypi.org/project/opml/0.5/

根据介绍,这个库只是对opml文件的解析,不支持修改opml文件,所以应该生成一个新的文件来储存。
在pycharm中使用opml
preference --> Project:* --> Project Interpreter --> +
一搜果然有opml,文件很小,几乎秒安装。
用parse引入文件
outline = opml.parse("英语纠错.opml")
可以用类似列表的方式读取opml中的内容
在引入时遇到了一个 空格,只有一个,很奇怪
 不能被opml库读取,会报错,删掉就好
测试文件如下:

执行下列语句
import opml
outline = opml.parse("英语纠错.opml")
print(len(outline))
print(outline.hjs)
print(len(outline[0]))
print(outline[0].text)
print(len(outline[0][0]))
print(outline[0][0].text)
print(len(outline[0][0][0]))
print(outline[0][0][0].text)
结果:
1
ctbfl
3
辨析
1
stare at
0
盯着
其中,outline的属性来自<head>...</head>
动手
先写一个输出函数
带有缩进的递归输出

out_note函数用于递归:
add = "" #控制缩进
def out_note(x):
#输入为元素本体
#输出元素下所有子项
global add
add = add + " "
print(add,end="")
for i in range(len(x)):
print("·"+x[i].text)
if len(x[i]) != 0:
out_note(x[i])
if i != len(x)-1:
print(add,end="")
else:
add = add[:len(add)-4]
再用out_main函数做前期准备工作:
def out_main(index):
#输入为元素序号
global add
add = ""
print(outline[index].text)
out_note(outline[index])
按字母表排序
获取每一个主项(缩进为0),并进行冒泡排序
list_index=list(range(n)) #储存序号
list_num = [""]*n #储存数字
for i in range(n):
temp = outline[i].text
list_num[i] = temp.lower()#统一小写
for i in range(n-1):
for j in range(n-i-1):
if list_num[j]>list_num[j+1]:
t = list_num[j+1]
tt = list_index[j+1]
list_num[j+1] = list_num[j]
list_index[j + 1] = list_index[j]
list_num[j] = t
list_index[j] = tt
聚合
import opml
doc = open("text2.txt","w")
outline = opml.parse("text.opml")
add = "" #控制缩进
def out_main(index):
global add
add = ""
print(outline[index].text,file=doc)
out_note(outline[index])
def out_note(x):
#输入元素本体
#输出元素下所有子项
global add
add = add + " "
print(add,end="",file=doc)
for i in range(len(x)):
print("·"+x[i].text,file=doc)
if len(x[i]) != 0:
out_note(x[i])
if i != len(x)-1:
print(add,end="",file=doc)
else:
add = add[:len(add)-4]
n = len(outline)
list_index=list(range(n)) #储存序号
list_num = [""]*n #储存数字
for i in range(n):
temp = outline[i].text
list_num[i] = temp.lower()
for i in range(n-1):
for j in range(n-i-1):
if list_num[j]>list_num[j+1]:
t = list_num[j+1]
tt = list_index[j+1]
list_num[j+1] = list_num[j]
list_index[j + 1] = list_index[j]
list_num[j] = t
list_index[j] = tt
for i in list_index:
out_main(i)
print("",file=doc)
print("----------------------------------------",file=doc)
效果
全文纯属个人理解
学识浅薄,方法简陋,有错误敬请指正
本文详细介绍了如何从幕布导出英语笔记至OPML格式,并使用Python库opml进行解析和处理,包括按字母排序和递归输出,适用于需要整理大量结构化笔记的场景。
1032

被折叠的 条评论
为什么被折叠?



