python解析FreeMind思维导图
记录瞬间
在实际工作中,通常需要使用思维导图进行一些分析和设计,但是,在设计好之后,想要把思维导图的内容转化成文字进行输出怎么做呢?
使用python(当然可以使用其他的语言进行处理)可以很好的解决这个问题。
代码如下:
# coding:utf-8
import os
from html.parser import HTMLParser def analyse_mm_file(mm_file):
if os.path.isfile(mm_file):
num = 1 # 记录行号的标记
point = 0 # 记录叶子节点的标记 1 是根节点
mark_node = 0 # 记录节点信息标记
mark_note = 0 # 记录备注信息标记
flow = "" # 记录流程信息
with open(mm_file) as f:
lines = f.readlines()
for line in lines:
line = line.rstrip('\n')
if mark_node == 1 or mark_note == 1:
with open("temp.html", mode="a", encoding="UTF-8") as f:
if line.rfind('<richcontent TYPE="NODE"><html>') != -1 or \
line.rfind('<richcontent TYPE="NOTE"><html>') != -1:
f.write("<html>\n")
num += 1
elif line.rfind('</html>') != -1:
f.write("</html>\n")
num += 1
elif line.rfind('</richcontent>') != -1:
num += 1
elif line.rfind('</node>') != -1:
point -= 1
if mark_node == 1: mark_node = 2
if mark_note == 1: mark_note = 2
num += 1
else:
f.write(line + "\n")
num += 1
continue
if mark_node == 2 or mark_note == 2:
data = analyse_html("./temp.html")
print("data = ", data)
os.remove("./temp.html")
if mark_node == 2:
# 操作 node 节点信息
for i in range(len(data)):
result = data[i].replace('\n', '')
print(result)
if mark_note == 2:
# 操作 note 备注信息
for i in range(len(data)):
result = data[i].replace('\n', '')
print(result)
if mark_node != 0: mark_node = 0
if mark_note != 0: mark_note = 0
if line.rfind('<map version="1.0.1">') == 0 and num == 1:
num += 1 if line.rfind('</map>') == 0:
print("解析文件完成!共解析 {} 行。".format(num))
elif line.rfind('</node>') == 0:
point -= 1
num += 1
elif line.rfind('<node ') == 0:
point += 1
if line.rfind('" TEXT="') != -1 and line[-2:] == '">':
start_num = line.rfind('" TEXT="') + 8
print("start num = ", start_num)
get_value = get_chinese(line[start_num: len(line) - 2])
print(get_value)
elif line.rfind('" TEXT="') != -1 and line[-2:] == '/>':
point -= 1
start_num = line.rfind('" TEXT="') + 8
print("start num = ", start_num)
get_value = get_chinese(line[start_num: len(line) - 3])
print(get_value)
if line.rfind('" TEXT="') == -1:
mark_node = 1 # 存在 HTML 网页
num += 1 if len(flow) == 0:
flow = "{}".format(point)
else:
if point == int(flow.split("_")[len(flow.split("_")) - 1]):
pass
else:
if point < int(flow.split("_")[len(flow.split("_")) - 1]):
flow = flow.split(str(point))[0] + str(point)
else:
flow = "{}_{}".format(flow, point)
print("总体的线性流程:", flow) elif line.rfind('<richcontent TYPE="NOTE"><html>') == 0:
with open("temp.html", mode="a", encoding="UTF-8") as f:
f.write('<html>\n')
mark_note = 1 # 存在备注信息
elif line.rfind('<icon ') == 0:
print(line)
num += 1
elif line.rfind('<arrowlink ') == 0: # 箭头指向,可以实现关联
print(line)
num += 1
elif line.rfind('<hook ') == 0:
print(line)
num += 1
elif line.rfind('<text>') == 0:
# point = point + 1
print(line)
num += 1
elif line.rfind('</hook>') == 0:
print(line)
num += 1
elif line.rfind('<cloud/>') == 0:
print(line)
num += 1
elif line.rfind('<font ') == 0:
print(line)
num += 1
elif line.rfind('<edge ') == 0:
print(line)
num += 1
else:
num += 1 else:
print("系统中没有找到没有FreeMind文件。{}".format(mm_file))
exit() def analyse_html(file_path):
with open(file=file_path, mode="r", encoding="UTF-8") as f:
page = f.read()
html_parser = HP()
html_parser.feed(page)
html_parser.close()
return html_parser.data def get_chinese(line):
get_word = ""
array = line.split("&#x")
flag = True
if line.find("&#x") != -1:
for i in range(len(array)): # 遍历数组
if len(array[i]) == 0 and flag: # 第一个值为空时,继续循环
flag = False
continue if array[i][4:5] == ";": # 解析Unicode字符
unicode = "\\u" + array[i][:4]
get_word = get_word + unicode.encode('latin-1').decode('unicode_escape') + array[i][5:]
elif array[i][:2] == "a;": # 换行转义
get_word = get_word + "\n" + array[i][2:]
else:
get_word = get_word + array[i] return get_word
else:
return line.replace('&', '&') class HP(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.tag_text = False
self.data = [] def handle_starttag(self, tag, attr):
if tag == 'p' or tag == 'li':
self.tag_text = True
if tag == 'img' and self._attr(attr, 'src'):
self.data.append("img:{}".format(self._attr(attr, 'src'))) def handle_endtag(self, tag):
if tag == 'p' or tag == 'li':
self.tag_text = False def handle_data(self, data):
if self.tag_text:
self.data.append(get_chinese(data)) def _attr(self, attr_list, attr_name):
for attr in attr_list:
if attr[0] == attr_name:
return attr[1]
return None analyse_mm_file("./mm/思维导图.mm")
================我是底线================
python解析FreeMind思维导图的更多相关文章
- My way to Python - Day05 - 面向对象-思维导图
My way to Python - Day05 - 面向对象 思维导图
- python学习之思维导图
思维导图——牛刀小试 刚刚学完了python的网络编程,在复习整理知识点的过程中,了解到思维导图是一种强大的工具. 思维导图又叫心智导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种 ...
- python开发基础--思维导图
开始学习python,相当于零基础 非自学,自学的痛苦不想体会和尝试,毕竟不会很友好,知乎上看到很多说自学的好处啊噼里啪啦的.嗯,说的很对,但是我偏不听,略略略.锻炼我的自学能力,这还需要锻炼吗,百度 ...
- Python基础知识思维导图|自学Python指南
微信公众号[软件测试大本营]回复"python",获取50本python精华电子书. 测试/开发知识干货,互联网职场,程序员成长崛起,终身学习. 现在最火的编程语言是什么?答案就是 ...
- 2020年最新78道JVM面试题总结(含答案解析和思维导图)
前言 关于JVM系列面试知识点总结了一个思维导图,分享给大家 1.java中会存在内存泄漏吗,请简单描述. 会.自己实现堆载的数据结构时有可能会出现内存泄露. 2.64 位 JVM 中,int 的长度 ...
- Linux常用命令,目录解析,思维导图
文章目录 下载地址 Linux常用命令 linux系统常用快捷键及符号命令 Linux常用Shell命令 Linux系统目录解析 Shell Vi全文本编辑器 Linux安装软件 Linux脚本编制编 ...
- Python知识体系思维导图:
基础知识 数据类型 1.序列 2.字符串 3.列表和元组 4.字典和集合 循环 & 判断
- python基础学习-思维导图总结
- Python基础教程思维导图笔记
说明:直接查看图片可能不太清楚,用浏览器打开后,按住 Ctrl ,网上滚动鼠标放大浏览器页面,可以看清楚图片
随机推荐
- 命令行编译C程序
1 准备工作 下载mingw-get-setup.exe并且安装 参考 http://www.jb51.net/softjc/159871.html 环境变量更新: PATH .;C:\MinGW\ ...
- PBRT笔记(3)——KD树
茎节点与叶子节点 茎节点与叶子节点皆适用KdAccelNode来表示 注意:这里使用了匿名union union有个特性:内部类型共用一段内存,且大小为内部最大类型的大小. struct KdAcce ...
- BZOJ 4763
有毒 第一开始一直RE,我就把dfs改成了bfs 结果一直TLE,自己造的数据要跑8s 因为 lxl 等人讲随机 $\sqrt{n}$ 个点作为关键点就可以了 但是我把随机改成深度有关就AC了,而且那 ...
- Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)
Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...
- Linux bash基础特性一
命令别名 alias cdnet=”cd /etc/sysconfig/network-scripts” 针对用户的别名: “~/.bashrc” 针对系统的别名:”/etc/bashrc” 重读配置 ...
- File类中的一些属性 添加删除文件夹
import java.io.File; import java.io.IOException; public class FileD { public static void main(String ...
- EASYUI combobox firefox 下取值为空的问题或不支持中文检索的问题
输入中文包含数字 或者全部非中文是没问题的,这个是因为火狐浏览器输入中文输入法的时候 只能触发onkeyup而不能触发onkeydown的问题.而easyui渲染后赋值给隐藏input的过程需要 依赖 ...
- easyui dialog 中 panel-body 高度太小出现 滚动条 的原因
easyui dialog 中 panel-body 高度太小出现 滚动条 的原因: dialog 高度比 iframe 高度大79 就可以了 $.editcompanypersoninfo = fu ...
- 让AI简单且强大:深度学习引擎OneFlow技术实践
本文内容节选自由msup主办的第七届TOP100summit,北京一流科技有限公司首席科学家袁进辉(老师木)分享的<让AI简单且强大:深度学习引擎OneFlow背后的技术实践>实录. 北京 ...
- 电子产品使用感受之----AirPods的一天使用体验分享
2019.03.29 晚上8点50分更新: 3月28日我的新款AirPods终于到货了,作为一代产品使用2年的用户,终于可以说说这枚新品的一天使用感受了: 我们会从以下几个方面来进行阐述: 外观 技术 ...