递归解析 LXML 树并避免重复进入某个节点

1、问题背景
我们在使用 LXML 库解析 MathML 表达式时,可能会遇到这样一个问题:在递归解析过程中,我们可能会重复进入同一个节点,导致解析结果不正确。例如,我们希望将以下 MathML 表达式解析为 Python 表达式:
<?xml version="1.0"?>
<math xmlns="http://www.w3.org/1998/Math/MathML" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/1998/Math/MathML http://www.w3.org/Math/XMLSchema/mathml2/mathml2.xsd"><mrow><mfrac><mn>3</mn></mn><mn>5</mn></mn></mfrac></mrow>
</math>
如果我们使用以下代码来解析该表达式:
def parseMML(mmlinput):from lxml import etreefrom StringIO import *from lxml import objectifyexppy=[]events = ("start", "end")context = etree.iterparse(StringIO(mmlinput),events=events)for action, elem in context:if (action=='start') and (elem.tag=='mrow'):exppy+='('if (action=='end') and (elem.tag=='mrow'):exppy+=')'if (action=='start') and (elem.tag=='mfrac'):mmlaux=etree.tostring(elem[0])exppy+=parseMML(mmlaux)exppy+='/'mmlaux=etree.tostring(elem[1])exppy+=parseMML(mmlaux)if action=='start' and elem.tag=='mn': #this is a numberexppy+=elem.textreturn (exppy)
那么我们得到的解析结果将是:
['(', '(', '3', ')', '/', '(', '5', ')', '(', '3', ')', '(', '5', ')', ')']
而不是我们期望的:
['(', '(', '3', ')', '/', '(', '5', ')', ')']
这是因为在解析 mfrac 节点时,我们递归调用了 parseMML 函数两次,分别解析了分子和分母。而在解析分子时,我们又递归调用了 parseMML 函数,导致重复进入了 mrow 节点。
2、解决方案
为了解决这个问题,我们可以使用一个栈来保存已经解析过的节点。当我们开始解析一个新的节点时,我们可以将该节点压入栈中。当我们完成解析该节点时,我们可以将该节点从栈中弹出。这样,我们就能够避免重复进入同一个节点。
以下代码演示了如何使用栈来避免重复进入同一个节点:
def parseMML(mmlinput):from lxml import etreefrom StringIO import *from lxml import objectifyexppy=[]events = ("start", "end")context = etree.iterparse(StringIO(mmlinput),events=events)nodestack=[]for action, elem in context:if action=='start' and elem.tag in nodestack:continueif (action=='start') and (elem.tag=='mrow'):nodestack.append(elem.tag)exppy+='('if (action=='end') and (elem.tag=='mrow'):nodestack.pop()exppy+=')'if (action=='start') and (elem.tag=='mfrac'):nodestack.append(elem.tag)mmlaux=etree.tostring(elem[0])exppy+=parseMML(mmlaux)exppy+='/'mmlaux=etree.tostring(elem[1])exppy+=parseMML(mmlaux)if action=='start' and elem.tag=='mn': #this is a numberexppy+=elem.textreturn (exppy)
使用该代码,我们可以得到正确的解析结果:
['(', '(', '3', ')', '/', '(', '5', ')', ')']
相关文章:
递归解析 LXML 树并避免重复进入某个节点
1、问题背景 我们在使用 LXML 库解析 MathML 表达式时,可能会遇到这样一个问题:在递归解析过程中,我们可能会重复进入同一个节点,导致解析结果不正确。例如,我们希望将以下 MathML 表达式解析为 Python 表达式&#x…...
GaussDB技术解读——GaussDB架构介绍(三)
目录 9 智能关键技术方案 智能关键技术一:自治运维系统 智能关键技术二:库内AI引擎 智能关键技术三:智能优化器 10 驱动接口关键技术方案 GaussDB架构介绍(二)从数据持久化存取层(DataNode)关键技术方案、全局事…...
解锁ChatGPT:从原理探索到GPT-2的中文实践及性能优化
⭐️我叫忆_恒心,一名喜欢书写博客的研究生👨🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支…...
【WPF】中的ListBox的ScrollIntoView方法使用
在WPF中,ListBox控件的ScrollIntoView方法用于确保指定的项在可视区域内可见。如果该项不在当前的视图中,该方法会滚动列表,使该项出现在视图中。这对于在用户交互或程序逻辑中需要突出显示特定列表项的场景非常有用。但是不会指定滚动的对齐…...
信息安全等级保护测评(等保测评)定级的重要性与实施路径
#等保测评##黑龙江等保测评##哈尔滨等保测评# 在数字化转型的浪潮中,信息安全已成为保障国家安全、社会稳定及企业发展的基石。信息安全等级保护测评(简称“等保测评”),作为中国网络安全领域的基础性制度,为组织机构的…...
Python库
Python库 babel huey 图片视频处理 moviepy 一个用于视频编辑的Python模块,可用于进行视频的基本操作(如剪切、连接、标题插入)、视频合成(也称非线性编辑)、视频处理或创建高级效果 patchworklib 一个专注于图像拼接和合成的Python库 patchworklib 一个专注与图…...
pytest+requests+allure自动化测试接入Jenkins学习
🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 最近在这整理知识,发现在pytest的知识文档缺少系统性,这里整理一下&…...
你能不能手敲出Spring框架?
Spring最成功的地方在于创始人Rod Johnson提出的IOC、AOP核心理念,反而不是其本身的技术。技术上今天可以有Spring春天,明天就可以有Autumn秋天。 核心理念有多重要?就如1871年巴黎公社的失败。公社在对抗法国zf和普鲁士占领军的背景下成立&…...
实体店如何通过私域获取流量?
随着互联网的快速发展和消费者购物习惯的变化,私域流量对于实体店的重要性日益凸显。私域流量是指企业在自己的平台上沉淀的、可以免费使用、多次利用的流量,如微信生态下的朋友圈、公众号、企业微信等。对于实体店而言,有效利用私域流量不仅…...
互联网与人工智能时代:问题的新形态与解答的挑战
随着互联网的普及和人工智能技术的飞速发展,我们仿佛进入了一个答案触手可及的新时代。然而,就在我们以为问题将因此逐渐减少之时,实则问题的形态和内涵正在发生深刻的变化。因此,我们不应简单地将互联网和人工智能视为解决问题的…...
机器学习与数据挖掘知识点总结(二)分类算法
目录 1、什么是数据挖掘 2、为什么要有数据挖掘 3、数据挖掘用在分类任务中的算法 朴素贝叶斯算法 svm支持向量机算法 PCA主成分分析算法 k-means算法 决策树 1、什么是数据挖掘 数据挖掘是从大量数据中发现隐藏在其中的模式、关系和规律的过程。它利用统计学、机器学…...
MySQL数据库初体验
目录 1.数据库基本概念 1.1 数据Data 1.2 表 1.3 数据库 1.4 数据库管理系统(DBMS) 1.5 数据库系统(DBS) 2.数据库的发展 3.主流的数据库介绍 3.1 SQL Server(微软公司产品) 3.2 Oracle (甲骨文公司产品&…...
关于RDMA传输的基本流量控制
Basic flow control for RDMA transfers | The Geek in the Corner (wordpress.com) 名词解释 IB : InfiniBand的缩写,指的就是InfiniBand技术。 MAD : Management Datagram的缩写。MAD是InfiniBand架构中用于设备管理和配置的一种特殊消息…...
Android Studio新增功能:Device Streaming
今天将Android Studio升级到2023.3.1 Patch2。发现新增了Device Streaming功能。支持远程使用Google的物理设备调试程序。这样可以方便地在真实设备上测试自己的APP。这对于手头没有Google设备的开发者而言,确实方便很多。该功能目前处于测试阶段,在2025…...
实施ISO 26262与ISO 21434的关键要素分析
随着汽车工业的快速发展和智能化水平的不断提升,汽车的功能性和安全性成为了消费者关注的重点。为了确保车辆的安全性和可靠性,国际标准化组织(ISO)制定了一系列与汽车安全相关的标准,其中ISO 26262(道路车…...
WinForm之TCP服务端
目录 一 原型 二 源码 一 原型 二 源码 using System.Net; using System.Net.Sockets; using System.Text;namespace TCP网络服务端通讯 {public partial class Form1 : Form{public Form1(){InitializeComponent();}TcpListener listener null;TcpClient handler null;Ne…...
【TB作品】MSP430 G2553 单片机 口袋板 日历 时钟 闹钟 万年历 电子时钟 秒表显示
文章目录 功能介绍操作方法部分流程图代码录制了一个演示视频可以下载观看 功能介绍 时间与日期显示: 实时显示当前时间(小时、分钟、秒)和日期(年、月、日)。 闹钟功能: 设置闹钟时间(小时、分…...
推流工具OBS的下载使用
一、下载安装 OBS,windows版本官网下载地址 二、推流步骤 安装好之后,打开软件 1、右下角,打开设置 2、输入推流地址,一般为rtmp格式开头的推流地址 输入完成后,应用并确定关闭窗口 3、“来源”里面新建媒体源、新…...
【设计模式之外观模式 -- C++】
外观模式 – 统一接口,简化调用 外观模式(Facade Pattern)是一种常用的软件设计模式,它为子系统中的一组接口提供了一个统一的高层接口,使得子系统更易于使用。外观模式定义了一个高层接口,这个接口使得这…...
【课程总结】Day8(上):深度学习基本流程
前言 在上一篇课程《【课程总结】Day7:深度学习概述》中,我们了解到: 模型训练过程→本质上是固定w和b参数的过程;让模型更好→本质上就是让模型的损失值loss变小;让loss变小→本质上就是求loss函数的最小值…...
Windows Cleaner终极指南:5分钟彻底解决C盘爆红和系统卡顿问题
Windows Cleaner终极指南:5分钟彻底解决C盘爆红和系统卡顿问题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner Windows Cleaner是一款专为Windows系统…...
OpenSpeedy游戏变速工具实战指南:打破帧率限制的完整攻略
OpenSpeedy游戏变速工具实战指南:打破帧率限制的完整攻略 【免费下载链接】OpenSpeedy 🎮 An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy OpenSpeedy是一款开源免费的游戏变速工具,能…...
ESP32-S3摄像头实战:按键触发拍照与SD卡自动存储方案
1. ESP32-S3摄像头项目核心价值与应用场景 当你手头有一块ESP32-S3开发板和摄像头模块时,最直接的冲动可能就是做个能拍照的小设备。但要把这个想法落地,需要解决三个关键问题:如何稳定触发拍摄?拍完的照片存哪里?怎么…...
ASLR:现代操作系统中的内存安全守护者
1. ASLR:现代操作系统的内存安全基石 想象一下你家的门锁每天都会自动更换位置——这就是ASLR(地址空间布局随机化)对计算机程序做的事。作为现代操作系统最基本的安全机制之一,ASLR通过打乱程序在内存中的"居住地址"&…...
STM32F103C8T6+TJA1042+UTA0403:手把手教你搭建CAN通讯测试环境(附完整接线图)
STM32F103C8T6TJA1042UTA0403:从零构建工业级CAN总线测试平台 第一次接触CAN总线的工程师往往会被物理层连接的各种细节困扰——为什么收发器需要独立供电?STB引脚悬空会导致什么后果?如何避免共模干扰?本文将用实验室级精度拆解S…...
终极指南:3步为Windows 11 LTSC系统快速安装微软商店
终极指南:3步为Windows 11 LTSC系统快速安装微软商店 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore Windows 11 LTSC(长期服务…...
RobotFramework自定义关键字开发指南:用Python扩展你的测试库
RobotFramework自定义关键字开发实战:Python扩展与分层设计 1. 为什么需要自定义关键字? 在自动化测试领域,RobotFramework以其关键字驱动的特性广受欢迎。但当你深入使用后会发现,标准库和第三方库提供的关键字往往无法完全满足…...
3个高效步骤解决猫抓扩展资源嗅探故障
3个高效步骤解决猫抓扩展资源嗅探故障 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓(Cat Catch)作为一款浏览器资源嗅…...
璀璨星河效果展示:古典结构×现代张力的Z-Image原生艺术生成
璀璨星河效果展示:古典结构现代张力的Z-Image原生艺术生成 “我梦见了画,然后画下了梦。” —— 文森特 梵高 今天,我想带你走进一个特别的数字艺术馆。在这里,冰冷的代码逻辑与炽热的艺术灵魂相遇,古典的审美结构与现…...
Wan2.2-I2V-A14B环境配置避坑指南:解决C盘空间不足与依赖冲突
Wan2.2-I2V-A14B环境配置避坑指南:解决C盘空间不足与依赖冲突 1. 引言 最近在Windows系统上配置Wan2.2-I2V-A14B环境时,我发现很多朋友都遇到了相同的问题:C盘空间莫名其妙被占满、各种依赖包冲突报错、CUDA版本不匹配等等。作为一个踩过所…...
