0

我正在尝试学习 XML 以解析通过 IMAP 从 GMail 下载的 GChats。为此,我正在使用 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

所以你得到一个无效标签的原因是,如果你要查看 lxml 解析 xml 的方式,它不使用命名空间“cli”,它看起来会像:

{url_where_Cli_is_define}消息

如果您参考自动 XSD 验证,您将看到我为简化管理大量模式等所做的工作。

同样,我为避免这个问题所做的工作,您只需使用 str.replace() 替换命名空间,将“cli:”更改为“{url}”。将所有命名空间放在一个字典中使这个过程很快。

我想汤会自动为你完成这个过程。

于 2012-03-26T21:23:34.530 回答
0

所以这没有得到任何回应,但如果有人想知道,BeautifulSoup 非常适合这个。我所要做的就是:

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

我得到了(相当)清晰的文本。

于 2012-03-16T00:22:09.083 回答