我正在尝试将一些代码从使用ElementTree迁移到使用lxml.etree并且在早期遇到错误:
>>> import lxml.etree as ET
>>> main = ET.Element("main")
>>> another = ET.Element("another", foo="bar")
>>> main.attrib.update(another.attrib)
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
main.attrib.update(another.attrib)
File "lxml.etree.pyx", line 2153, in lxml.etree._Attrib.update
(src/lxml/lxml.etree.c:46972)
ValueError: too many values to unpack (expected 2)
但我可以使用以下内容进行更新:
>>> main.attrib.update({'foo': 'bar'})
这是lxml(版本2.3)中的错误还是我错过了一些明显的东西?
答案 0 :(得分:3)
我遇到同样的错误,不要认为这只是2.3问题。
解决方法:
main.attrib.update(dict(another.attrib))
# or more efficient if it has many attributes:
main.attrib.update(another.attrib.iteritems())
<强>更新强>
lxml.etree._Attrib.update
接受dict或iterable (source)。虽然_Attrib
具有dict
接口,但它不是dict
实例。
In [3]: type(another.attrib)
Out[3]: lxml.etree._Attrib
In [4]: isinstance(another.attrib, dict)
Out[4]: False
因此update
会尝试将项目迭代为key, value
。也许这是为了表现而已。只有lxml
作者知道。
如何在lxml
中更改它:
子类dict
。
检查hasattr(sequence_or_dict, 'items')
。
我不熟悉Cython
并且不知道哪个更好。