【问题标题】:How can Python get a list from XML such as Unicode to a list?Python 如何从 Unicode 等 XML 中获取列表到列表?
【发布时间】:2015-11-26 15:45:43
【问题描述】:

我在阅读 XML 时遇到问题。我想得到一个二维数组。但是,当我从 XML 获取数据时,数据类型是 Unicode。因此,我键入以使用 list()。然而,结果并不是我想要的。我可以使用其他方式获取 2D 列表吗?

如何删除 u、\n、\t 并获得正确答案?谢谢。

abc.xml

<text>
    <item id="1">
        [[2, 2, 1],
        [1, 0, 0],
        [1, 0, 0]]
    </item>  
</text>

Python:

import  xml.dom.minidom

dom = xml.dom.minidom.parse('abc.xml')

bb = dom.getElementsByTagName('item')
b=bb[0]

l= b.firstChild.data
print l

a=list(l)
print a

输出:

[[2, 2, 1]
 [1, 0, 0] 
 [1, 0, 0]]

[u'\n', u' ', u' ', u' ', u' ', u'\t', u'\t', u'[', u'\n', u' ', u' ', u' ', u' ', u'\t', u'\t', u'\t', u'[', u'2', u',', u' ', u'2', u',', u' ', u'1', u']', u'\n', u' ', u' ', u' ', u' ', u'\t', u'\t', u'\t', u'[', u'1', u',', u' ', u'0', u',', u' ', u'0', u']', u' ', u'\n', u' ', u' ', u' ', u' ', u'\t', u'\t', u'\t', u'[', u'1', u',', u' ', u'0', u',', u' ', u'0', u']', u' ', u'\n', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u' ', u'\n', u' ', u' ', u' ', u' ', u'\t', u'\t', u']', u'\n', u' ', u' ', u' ', u' ', u'\t']
[Finished in 0.1s]

【问题讨论】:

  • 您必须自己解析 l 变量中的文本。
  • 我认为a=eval(l) 应该可以工作
  • eval 应谨慎使用,因为它会执行任何代码,而不仅仅是返回一个列表。

标签: python xml list unicode


【解决方案1】:

这个问题很像一个老问题:Convert string representation of list to list in Python

简而言之,您想解析一个 unicode 字符串 (u"[\n[1,2,3],\n...") 到 Python 列表文字中,因此您想在读取和解析程序时执行与 Python 解释器相同的操作。

您可以为此使用ast 模块:

import ast
a=ast.literal_eval(l)

在你的情况下。请注意,此函数将评估 any python 文字,因此如果您只是将 "1" 放入您的 xml 中,则结果 a 将是数字 1

更多解释请参见documentation for ast.literal_evel

【讨论】:

  • 它再次显示新消息。[[2, 2, 1]IndentationError: unexpected indent 我该怎么办?
【解决方案2】:

有点老套,但适合你的情况:

import ast
from lxml import html

text = """<text>
    <item id="1">
        [
            [2, 2, 1]
            [1, 0, 0] 
            [1, 0, 0] 

        ]
    </item>  
</text>"""

tree = html.fromstring(text)
data = ast.literal_eval(''.join([x.strip() for x in tree.xpath('//text/item[@id="1"]/text()')[0].replace('\n', '').replace(']','],').strip() if x.strip() !=""]).strip())[0]

print type(data)
print data

输出:

<type 'list'>
[[2, 2, 1], [1, 0, 0], [1, 0, 0]]

【讨论】:

  • 我尝试使用这种方式。它显示“IndexError:列表索引超出范围”。当我从 XML 读取数据时,它没有标签 ()。我应该改变什么?
  • @HimYikTang 然后编辑您的问题并提供良好的 XML 文件内容示例
【解决方案3】:

您可以只使用映射将 unicode 转换为字符串:

new_list = map(str, old_list)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2019-12-31
    • 1970-01-01
    • 2013-03-30
    相关资源
    最近更新 更多