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 ,网上滚动鼠标放大浏览器页面,可以看清楚图片
随机推荐
- Linux 上使用LVM 扩展磁盘Size
第一步:使用 fdisk -l 查看当前磁盘容量 fdisk -l 第二步: 使用 fdisk /dev/sda/ 为free space 添加新的分区 fdisk /dev/sda m :列出所有命 ...
- 【AtCoder】【模型转化】【二分答案】Median Pyramid Hard(AGC006)
题意: 给你一个排列,有2*n-1个元素,现在进行以下的操作: 每一次将a[i]替换成为a[i-1],a[i],a[i+1]三个数的中位数,并且所有的操作是同时进行的,也就是说这一次用于计算的a[], ...
- [Caffe]Win10+VS2015+CUDA8.0+cudnn5.1环境配置
百度:win10 caffe vs2015 编译caffe.sln工程参见->这里 caffe训练参见->这里 参见->这里 Windows+VS2013爆详细Caffe编译安装教程
- MariaDB基本操作--(创建用户)(转)
一. 创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用户名 host:指定该用户 ...
- Module(CP343-1)Advanced system error SDB generation Error in rule file or rule file not found
报这个故障的原因是因为安装目录下缺少三个 err文件.只要从好的目录下拷贝过来即可. C:\Program Files (x86)\SIEMENS\Step7\s7wbx\rul
- (92)Wangdao.com_第二十五天_线程机制_H5 Web Workers 分线程任务_事件 Event
浏览器内核 支撑浏览器运行的最核心的程序 IE 浏览器内核 Trident内核,也是俗称的IE内核Chrome 浏览器内核 统称为 Chromium 内核或 ...
- servlet实现简单的登录功能
1.登录页面 Login.html <%@page contentType="text/html" pageEncoding="UTF-8"%> & ...
- Differenciate or distinguish between outlook attachment and embedded image/signature using property accessor in C#.NET
These days, outlook emails are composed in three formats; plain text, html and rtf (rich text format ...
- PAT甲级1103 Integer Factorization【dfs】【剪枝】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805364711604224 题意: 给定一个数n,要求从1~n中找 ...
- Integer、new Integer() 和 int 比较的面试题
基本概念的区分: 1.Integer 是 int 的包装类,int 则是 java 的一种基本数据类型2.Integer 变量必须实例化后才能使用,而int变量不需要3.Integer 实际是对象的引 ...