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 ,网上滚动鼠标放大浏览器页面,可以看清楚图片
随机推荐
- Update修改方法判断该ID的数据是否超过24小时,超过不许修改
@PostMapping("/update") public Result projectUpdate(@RequestBody ProjectVoEntity projectvo ...
- python-ironicclient使用
使用cli from ironicclient import client kwargs = {'os_username': 'ironic', 'os_password': 'IRONIC_PASS ...
- JS对象3
1.BOM对象 window对象 所有浏览器都支持window对象 概念上讲:一个html文档对应一个window对象 功能上讲:控制浏览器窗口的 使用上讲:window对象不需要创建对象,直接使用即 ...
- three.js 加入纹理(texture)的方法及注意事项
var texture = new THREE.TextureLoader().load( './img/1.png' ); var box_show = new THREE.CubeGeometry ...
- Educational Codeforces Round 6
620A - Professor GukiZ's Robot 20171122 \(ans=max(\left | x2-x1 \right |,\left | y2-y1 \right |)\ ...
- java反射机制的简单使用
java 反射机制 反射机制简介 参考地址 什么是反射机制 反射机制指程序在运行时能够获取自身的信息.在java中只要给定类的名字,就可以通过反射机制获得类的所有信息 反射机制的优缺点 首先了解一下动 ...
- 【Java算法學習】斐波那契數列問題-兔子產子經典問題
/** * 用遞推算法求解斐波那契數列:Fn = Fn-2 +Fn-1; */ import java.util.*; public class Fibonacci { public static v ...
- racket安装
https://www.cnblogs.com/scige/p/3379447.html
- 描述逻辑(DL)基础知识
Logic逻辑理论实际上是一个规范性(normative)的理论,而不是一个描述性的(descriptive)理论.即,它并不是用来描述人类究竟是采用何种的形式来推理的,而是来研究人类应该如何有效的进 ...
- Linux升级python3之后yum不能正常使用解决方法一:重新配置yum源
[转]linux下yum安装及配置 分步阅读 公司使用的是linux搭建服务器,linux安装软件能够使用yum安装依赖包是一件非常简单而幸福的事情,所以这里简单介绍一下linux安装yum源流程和操 ...