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 ,网上滚动鼠标放大浏览器页面,可以看清楚图片
随机推荐
- nginx 配置laravel框架域名配置
server { listen 80; server_name admin.meiquick.local.com; #charset koi8-r; # access_log /var/log/ngi ...
- DDoS攻击与防御(4)
在发生DDoS攻击的情况下,可以通过一些缓解技术来减少攻击对自身业务和服务的影响,从而在一定程度上保障业务正常运行.缓解DDoS攻击的主要方法是对网络流量先进行稀释再进行清洗. 1.攻击流量的稀释 1 ...
- Problem B. Beer Refrigerator
http://codeforces.com/gym/241680/problem/B比赛的时候考虑的是,它们3个尽可能接近,然后好麻烦,不如暴力枚举,这里不需要质因数分解,而是两重循环枚举所有因数,第 ...
- JavaScript中作用域和作用域链的简单理解(变量提升)
通过阅读<JS高级程序设计>这本书,对js中的作用域和作用域链知识有了初步的了解和认识,准备成笔记供大家参考,笔记中字数比较多,但个人认为叙述的挺详细的,所以希望读者耐心看.再者,本人了解 ...
- git 从远程仓库获取所有分支
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}& ...
- 杭电1506 java
求最大子矩阵面积(dp) import java.util.*; public class Main1{ public static void main(String[] args) { Scanne ...
- 汇编入门——使用DOSBox写一个HelloWorld以及相关软件安装
0.0.0) 在D盘建立一个ASM文件夹 0.0.1) 放入所需要的文件 1所标示的红色框为必须要存在的文件,要处理汇编文件.百度网盘中下载. 2自己编写的汇编(asm)文件. 3编译汇编自己生成的文 ...
- 通过mycat实现mysql的读写分离
mysql的主从配置沿用上一篇博客的配置:https://www.cnblogs.com/MasterSword/p/9434169.html mycat下载地址:http://www.mycat.i ...
- 模块化Javascript代码的两种方式
1.将模块整体放在函数里 function buildMonthNameModule() { var names = ["January ", "February&quo ...
- js表单反显
/* * 表单自动回显js * 依赖JQURY * 使用参考:$("#form1").form("load",{"id":"112 ...