1

会社のシステムでエラーが発生すると、メールが届きます。このメールには XML がすべて 1 行に詰め込まれています。

XML 以外のすべてを解析してきれいに出力する notepad++ Python スクリプトを作成しました。残念ながら、一部の電子メールに含まれる 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」タグが自動的に閉じられていることに注意してください」

これを処理する notepad++ スクリプトを作成するには、

  • tarballをダウンロードしてファイルを解凍します
  • 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 として解釈されないように、コンストラクターの 2 番目の引数に注意してください。

于 2013-08-22T19:16:41.050 に答える