幕布笔记按字母顺序导出(Python+Opml)

本文详细介绍了如何从幕布导出英语笔记至OPML格式,并使用Python库opml进行解析和处理,包括按字母排序和递归输出,适用于需要整理大量结构化笔记的场景。
Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

缘起

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

准备

幕布的导出有五个格式: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中的内容

在引入时遇到了一个&nbsp空格,只有一个,很奇怪
&nbsp不能被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)

效果在这里插入图片描述

全文纯属个人理解
学识浅薄,方法简陋,有错误敬请指正

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值