首页 > 解决方案 > 安装的 lxml 在使用另一个函数时会导致 TypeError

问题描述

所以我有这段代码(没有安装 lxml)按预期工作

from xml.etree.ElementTree import Element, tostring
from xmljson import badgerfish as bf

dic = {'p': {'@id': 'main'}}

output = bf.etree(dic, root=Element('root'))
print(tostring(output).decode('utf-8'))

输出是

<root><p id="main" /></root>

问题是我需要 lxml 来完成另一个任务,但是如果我安装它(通过 pip install lxml),上面的代码会产生这个错误

TypeError: append() argument must be xml.etree.ElementTree.Element, not lxml.etree._Element 

那么如何将上面的代码与 lxml 一起使用呢?

完整的堆栈跟踪:

TypeError                                 Traceback (most recent call last)
<ipython-input-1-7478b75b9581> in <module>
      4 dic = {'p': {'@id': 'main'}}
      5 
----> 6 output = bf.etree(dic, root=Element('root'))
      7 print(tostring(output).decode('utf-8'))

~/.local/lib/python3.7/site-packages/xmljson/__init__.py in etree(self, data, root)
    132                     if elem is None:
    133                         continue
--> 134                     result.append(elem)
    135                     # Treat scalars as text content, not children (Parker)
    136                     if not isinstance(value, (self.dict, dict, self.list, list)):

TypeError: append() argument must be xml.etree.ElementTree.Element, not lxml.etree._Element

标签: pythonpython-3.xlxml

解决方案


正如@jordanm 建议的那样,我必须将 lxml 元素传递给 bf.etree() 而不是 xml.etree 元素,所以工作代码是

from lxml.etree import Element as EElement
from xml.etree.ElementTree import Element, tostring
from xmljson import badgerfish as bf

dic = {'p': {'@id': 'main'}}

output = bf.etree(dic, root=EElement('root'))
print(tostring(output).decode('utf-8'))

产生正确的输出

<root><p id="main" /></root>

推荐阅读