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 ,网上滚动鼠标放大浏览器页面,可以看清楚图片
随机推荐
- JDK 5~8的特性对比
原文请参考:https://bbs.csdn.net/topics/392062347 jdk5新特性 1.自动装箱和拆箱2.枚举3.静态导入4.可变参数5.內省 是Java语言对Bean类属性. ...
- React十进制和二进制转换的实现和分析
[描述] 模仿官方文档的摄氏度和华氏度的转换,实现十进制和二进制的互换. [实现] import React from 'react'; import ReactDOM from 'react-dom ...
- aspnet mvc 中 跨域请求的处理方法
ASP.NET 处理跨域的两种方式 方式1,后端程序处理.原理:给响应头加上允许的域即可,*表示允许所有的域 定义一个cors的过滤器 加在在action或者co ...
- ISP PIPLINE (八) RGB2YUV
what is the YUV? 暗电流来源1.YUV 是一种基本色彩空间, 人眼对亮度改变的敏感性远比对色彩变化大很多.亮度分量Y 要比色度分量U.V 重要得多. 所以, 可以适当地抛弃部分U.V分 ...
- Android应用程序后台加载数据
从ContentProvider查询你需要显示的数据是比较耗时的.如果你在Activity中直接执行查询的操作,那么有可能导致Activity出现ANR的错误.即使没有发生ANR,用户也容易感知到一个 ...
- __x__(26)0907第四天__文档流_网页最底层
文档流 处在网页的最底层,表示的是一个页面中的位置. 创建的元素,默认都处于文档流中. 元素在文档流中的特点 块元素 在文档流中独占一行. 自上而下排列. 宽度默认占父元素的 100%,width=& ...
- JS节流和防抖
事件的触发权很多时候都属于用户,有些情况下会产生问题: 向后台发送数据,用户频繁触发,对服务器造成压力 一些浏览器事件:window.onresize.window.mousemove等,触发的频率非 ...
- Windows下自带压缩文件工具之-makecab
在内网渗透时,当没有rar.7z等压缩工具时候,拖取文件的时候为了防止流量过大,又必须压缩把文件压缩.当然你可以自己上传一个压缩工具.Windows自带制作压缩文件工具makecb你可以了解哈.压缩单 ...
- Windows中使用ssh利用公钥登入远程服务器
方式:使用 Winscp 密钥登录 我们平时开发多会使用 ftp 来上传下载文件,尤其是很多 Linux 环境下. 其实 Linux 默认是不提供 ftp 的,需要你额外安装 FTP 服务 ...
- Invalid bound statement (not found): com.xsw.dao.CategoryDao.getCategoryById] with root cause
五月 30, 2018 11:11:03 上午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() fo ...