【问题标题】:Python - Remove Unclosed TagsPython - 删除未关闭的标签
【发布时间】:2014-11-26 20:50:40
【问题描述】:

在 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>

我们有一个额外的开放标签:

<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>

【问题讨论】:

  • 你还有一个额外的&lt;/TIMEX&gt;,就在第一行的but之前...
  • 是的,我忘了添加那个。已更新。
  • Link。尝试这个。我看到了它的 HTML,但也许你可以处理自定义标签。
  • @juree,我最初是在看那个,但它似乎可以处理添加丢失的标签,而不是删除多余的标签。但是是的,BeautifulSoup 可以处理这些类型的自定义标签。
  • 基于大多数许可解析器的工作方式,看到像&lt;hi&gt; 这样的开始标签,他们假设标签包含最大数量的后续节点。这与+* 正则表达式运算符的“贪婪”行为完全相同。在这种情况下,&lt;hi&gt; 将包含您的整个文档,删除它会删除所有内容。可能不是你想要的。但这就是像 BeautifulSouplxml.html 这样的宽容解析器会给你的。

标签: python beautifulsoup lxml


【解决方案1】:

一种解决方案可以是遍历字符串,查找标签,包括已关闭和已打开的标签。

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

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

【讨论】:

    猜你喜欢
    • 2022-11-15
    • 2014-04-11
    • 2013-03-28
    • 1970-01-01
    • 2022-03-16
    • 2011-04-09
    • 1970-01-01
    • 2023-04-02
    • 2016-10-09
    相关资源
    最近更新 更多