1

当我公司的系统出现错误时,我会收到一封电子邮件。这封电子邮件包含的 XML 全部塞在一行中。

我编写了一个 notepad++ Python 脚本,它解析除 XML 之外的所有内容并漂亮地打印出来。不幸的是,一些电子邮件包含过多的 XML 数据并且被截断。一般来说,截断的数据对我来说并不重要。我希望能够自动关闭任何打开的标签,以便我的 Python 脚本工作。它不需要聪明或正确,它只需要使 xml 格式足够好,脚本可以运行。有没有办法做到这一点?

我对 Python 脚本、在线应用程序、可下载应用程序等持开放态度。

  • 我意识到正确的解决方案是获取未截断的 xml,但是拉动正确的杠杆来完成工作将远远超过处理它的工作量。
4

2 回答 2

4

使用美丽的汤

>>> import bs4
>>> s= bs4.BeautifulSoup("<asd><xyz>asd</xyz>")
>>> s
<html><head></head><body><asd><xyz>asd</xyz></asd></body></html>
>>
>>> s.body.contents[0]
<asd><xyz>asd</xyz></asd>

请注意,它自动关闭了“asd”标签”

要创建记事本++ 脚本来处理此问题,

  • 下载压缩包并解压文件
  • bs4目录复制到 PythonScript/scripts 文件夹。
  • 在 notepad++ 中,将以下代码添加到您的 python 脚本中

 

#import Beautiful Soup
import bs4
#get text in document
text = editor.getText()
#soupify it to fix XML
soup = bs4.BeautifulSoup(text)
#convert soup object to string again
text = str(soup)
#clear editor and replace bad xml with fixed xml
editor.clearAll()
editor.addText(text)
#change language to xml
notepad.menuCommand( MENUCOMMAND.LANG_XML )
#soup has its own prettify, but I like the XML tools version better
notepad.runMenuCommand('XML Tools', 'Pretty print (XML only - with line breaks)', 1)
于 2013-08-22T19:13:45.077 回答
3

如果你安装了BeautifulSoup 和 lxml,这很简单:

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup("""
... <?xml version="1.0" encoding="utf-8"?>
... <a>
...   <b>foo</b>
...   <c>bar</""", "xml")
>>> soup
<?xml version="1.0" encoding="utf-8"?>
<a>
<b>foo</b>
<c>bar</c></a>

请注意构造函数的第二个"xml"参数,以避免将 XML 解释为 HTML。

于 2013-08-22T19:16:41.050 回答