Разбор XML / HTML-кодированных GChats - PullRequest
0 голосов
/ 14 марта 2012

Я пытаюсь изучить XML, чтобы проанализировать GChats, загруженные из GMail через IMAP.Для этого я использую 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

Кто-нибудь знает, что здесь происходит?

Ответы [ 2 ]

0 голосов
/ 27 марта 2012

Итак, причина, по которой вы получили недопустимый тег, заключается в том, что если вы посмотрите, как lxml анализирует xml, он не использует пространство имен "cli", а выглядит так:

{url_where_Cli_is_define} Сообщение

Если вы обратитесь к Автоматическая проверка XSD , вы увидите, что я сделал, чтобы упростить управление большим количеством схем и т. д.

аналогично тому, что яЧтобы избежать этой проблемы, вы просто замените пространство имен с помощью str.replace (), чтобы изменить "cli:" на "{url}".поместив все пространства имен в один словарь, ускорил этот процесс.

Я думаю, что суп делает этот процесс для вас автоматически.

0 голосов
/ 16 марта 2012

Таким образом, это не получило никакого ответа, но в случае, если кто-то задавался вопросом, BeautifulSoup работал фантастически для этого. Все, что мне нужно было сделать, это:

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

И я получил (довольно) четкий текст.

...