Python-删除未关闭的标记

Python-删除未关闭的标记,python,beautifulsoup,lxml,Python,Beautifulsoup,Lxml,在Python中,我有一系列混乱的字符串和未关闭的标记。注意:这不需要像NLP解析器那样是正确的XML。例如,考虑以下字符串: <hi><TIMEX>every monday, wednesday and friday</TIMEX> </TIMEX>but <TIMEX>not saturday </TIMEX></bye><TIMEXUNTIL>until january</TIMEXUN

在Python中,我有一系列混乱的字符串和未关闭的标记。注意:这不需要像NLP解析器那样是正确的XML。例如,考虑以下字符串:

<hi><TIMEX>every monday, wednesday and friday</TIMEX> </TIMEX>but <TIMEX>not saturday 
</TIMEX></bye><TIMEXUNTIL>until january</TIMEXUNTIL> from <TIMERANGE>11:30am-12:00
</TIMERANGE>
每周一、周三和周五,但不包括周六
从11:30am-12:00到1月
我们有一个额外的开放标签:

<hi>

和额外的结束标记:

</TIMEX>
</bye>

如何轻松删除任何没有匹配打开/关闭的标记?我正在寻找的输出是:

<TIMEX>every monday, wednesday and friday</TIMEX> but <TIMEX>not saturday 
</TIMEX><TIMEXUNTIL>until january</TIMEXUNTIL> from <TIMERANGE>11:30am-12:00
</TIMERANGE>
每周一、周三和周五,但不包括周六
从11:30am-12:00到1月

一种解决方案是迭代字符串,查找关闭和打开的标记

然后把逻辑,相应地。理想情况下,它可以通过堆栈数据结构来解决。可以使用以下逻辑编写代码。-

  • 让a作为标签,打开或关闭
  • 检查标签是否在列表中,以相反的方式检查
  • 如果您在列表中找到合适的标记并将其删除。如果没有,也添加该标记及其位置。适当的标记可以定义为一个开放标记的闭合标记或另一个开放标记,或者一个封闭标记的开放标记
  • 在迭代结束时,您将拥有未关闭/未打开的标记及其位置。现在您可以继续并删除

  • 你还有一个额外的
    ,就在单词
    的前面,但是在第一行,
    是的,我忘了加上那个。更新。。试试这个。我看到了它的HTML,但也许你可以处理自定义标记。@juree,我本来是在看那个,但它似乎可以处理添加缺少的标记,而不是删除多余的标记。但是是的,BeautifulSoup可以处理这些类型的自定义标记。根据大多数允许的解析器的工作方式,看到像
    这样的开始标记,它们假设标记包含了最多数量的以下节点。这与
    +
    *
    regexp运算符的“贪婪”行为完全相同。在这种情况下,
    将包含整个文档,删除它将删除所有内容。可能不是你想要的。但这正是像
    BeautifulSoup
    lxml.html
    这样的允许解析器所能提供的。