元素树(Python)itertext不使用换行符

时间:2013-10-14 23:09:40

标签: python xml-parsing

作为我最近发布的一个跟进问题......

我正在使用ElementTree进行一些XML解析,我在Python中有以下方法:

def extract_all_text(element):
  "".join(element.itertext())

这样做的目的是从元素中提取文本,剥离包装元素中任何文本的任何标记。 ėg。,extract_all_text(ElementTree.fromstring('<a>B <c>D</c></a>'))应该返回B D。但是,我在尝试将此方法与包含换行符的文件中的元素一起使用时遇到了一个奇怪的错误。错误如下所示:

File "/home/Intredasting/foo.py", line 74, in bar
  description = extract_all_text(root.find('description')).strip()
File "/home/Intredasting/foo.py", line 62, in extract_all_text
  return "".join(element.itertext())
TypeError: sequence item 0: expected str instance, list found

如果我运行ElementTree.dump(root.find('description')),它显示了我想要解析的XML元素,我明白了:

<description>
  Foo <a href="http://example.com">bar</a>.
</description>

如果我通过编辑文件来删除换行符,以便元素看起来像这样:

<description>Foo <a href="http://example.com">bar</a>.</description>

然后该方法完美运行,我得到Foo bar.。为什么会这样?如何让该方法使用换行符?

修改

您可以在此处看到我正在使用的特定文件(我将其缩小为简单版本,但仍会导致错误):http://www.filedropper.com/example_1

要测试此文件,请尝试

$ python3
>>> import xml.etree.ElementTree as ET
>>> tree = ET.parse('/path/to/example.xml')
>>> desc = tree.getroot().find('description')
>>> print("".join(desc.itertext()))

(这应该会产生错误。)

另一个编辑

此代码提供了对正在发生的事情的进一步了解(除上述代码外还运行此代码)

>>> for text in desc.itertext(): print(text)
['\n', '    Foo ']
bar
['.', '\n', '  ']

当然,我可以通过简单地将这些列表连接成一个字符串来解决这个问题。但我觉得这可能是ElementTree的一个错误,或输入文件的时髦,或者我的Python版本搞砸了。

1 个答案:

答案 0 :(得分:0)

无法使用Python 2.7.5和ElementTree 1.3.0复制结果

In [1]: import xml.etree.ElementTree as ET

In [2]: ET.VERSION
Out[2]: '1.3.0'

In [3]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:el = ET.fromstring("""<description>
:        Foo <a href="http://example.com">bar</a>.
:    </description>""")
:--

In [4]: "".join(el.itertext())
Out[4]: '\n        Foo bar.\n    '

您使用的是哪个版本的Python和ElementTree?如果您使用的是Python 3.3+,则可能与此错误相关http://bugs.python.org/issue16913在3.3.1 中修复)

修改

我在Python 3.3.2+中尝试了您的代码( print应该是函数btw )并且无法重现该错误,但Python 3.3.0提供了相同的错误消息。我会说这是一个ElementTree问题。