0

IMAP 経由で GMail からダウンロードした GChat を解析するために、XML を学習しようとしています。そのために lxml を使用しています。チャット メッセージの各行は、次のようにフォーマットされます。

<cli:message to="email@gmail.com" iconset="square" from="email@gmail.com" int:cid="insertid" int:sequence-no="1" int:time-stamp="1236608405935" xmlns:int="google:internal" xmlns:cli="jabber:client">

<cli:body>Nikko</cli:body>

<met:google-mail-signature xmlns:met="google:metadata">0c7ef6e618e9876b</met:google-mail-             signature>

<x stamp="20090309T14:20:05" xmlns="jabber:x:delay"/>

<time ms="1236608405975" xmlns="google:timestamp"/>

</cli:message>

次のように XML ツリーを構築しようとすると、次のようになります。

root = etree.Element("cli:message")

次のエラーが表示されます。

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "lxml.etree.pyx", line 2568, in lxml.etree.Element (src/lxml/lxml.etree.c:52878)
File "apihelpers.pxi", line 126, in lxml.etree._makeElement (src/lxml/lxml.etree.c:11497)
File "apihelpers.pxi", line 1542, in lxml.etree._tagValidOrRaise      (src/lxml/lxml.etree.c:23956)
ValueError: Invalid tag name u'cli:message'

次のようにエスケープしようとすると:

root = etree.Element("cli\:message")

まったく同じエラーが発生します。

チャットのヘッダーにも次の情報が表示されます。これは関連していると思われます。

Content-Type: text/xml; charset=utf-8
Content-Transfer-Encoding: 7bit

ここで何が起こっているか知っている人はいますか?

4

2 に答える 2

0

したがって、これには何の反応もありませんでしたが、誰かが疑問に思っている場合に備えて、BeautifulSoup はこれに対して素晴らしく機能しました。私がしなければならなかったのはこれだけでした:

soup = BeautifulSoup(repr(msg_data))
print(soup.get_text())

そして、(かなり)クリアテキストを取得しました。

于 2012-03-16T00:22:09.083 に答える
0

したがって、無効なタグを取得した理由は、lxml が xml を解析する方法を見ると、名前空間「cli」を使用していないため、代わりに次のようになります。

{url_where_Cli_is_define}メッセージ

自動 XSD 検証を参照すると、大量のスキーマの管理を簡素化するために私が何をしたかがわかります。

同様に、この問題を回避するために私がしたことは、str.replace() を使用して名前空間を置き換えて、「cli:」を「{url}」に変更することです。すべての名前空間を 1 つのディクショナリに配置したことで、このプロセスが迅速になりました。

スープがこのプロセスを自動的に行うと思います。

于 2012-03-26T21:23:34.530 に答える