我正在尝试使用Python的ElementTree包编写XML文件。基本上我创建了一个名为allDepts
的根元素,然后在我的for循环的每次迭代中,我调用一个返回deptElement
的函数,该函数包含大量关于大学系的信息。我将每个deptElement
添加到allDepts
,从ElementTree
中创建allDepts
,并尝试将其写入文件。
def crawl(year, season, campus):
departments = getAllDepartments(year, season, campus)
allDepts = ET.Element('depts')
for dept in departments:
deptElement = getDeptElement(allDepts, dept, year, season, campus)
print ET.tostring(deptElement) #Prints fine here!
ET.SubElement(allDepts, deptElement)
if deptElement == None:
print "ERROR: " + dept
with open(str(year) + season + "_" + campus + "_courses.xml", 'w') as f:
tree = ET.ElementTree(allDepts)
tree.write(f)
出于某种原因,在tree.write(f)
行,我收到此错误:“TypeError:无法连接'str'和'instance'对象”。每个deptElement
在for循环中打印得很好,让我觉得getDeptElement()
工作正常。我从未打印出“错误”消息。有谁知道我做错了什么?
编辑:这是完整的堆栈跟踪:
File "./CourseInfoCrawl.py", line 210, in <module>
crawl("2013", "S", "UBC")
File "./CourseInfoCrawl.py", line 207, in crawl
tree.write(f)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/etree/ElementTree.py", line 663, in write
self._write(file, self._root, encoding, {})
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/etree/ElementTree.py", line 707, in _write
self._write(file, n, encoding, namespaces)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/etree/ElementTree.py", line 681, in _write
file.write("<" + _encode(tag, encoding))
答案 0 :(得分:1)
似乎以下行是原因。
print "ERROR: " + dept
按以下方式更改并重试:
print "ERROR: ", dept
OR
print "ERROR: " + str(dept)
添加强>
ET.SubElement的第二个参数应该是str。 deptElement
是str吗?
如果deptElement
是元素,请使用allDepts.append(deptElement)
。
http://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement http://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.append
ADD 2 重现错误(Python 2.6):
>>> from xml.etree import ElementTree as ET
>>> allDepts = ET.Element('depts')
>>> ET.SubElement(allDepts, ET.Element('a'))
<Element <Element a at b727b96c> at b727b22c>
>>> with open('a', 'wb') as f:
... tree = ET.ElementTree(allDepts)
... tree.write(f)
...
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
File "/home/falsetru/t/Python-2.6/Lib/xml/etree/ElementTree.py", line 663, in write
self._write(file, self._root, encoding, {})
File "/home/falsetru/t/Python-2.6/Lib/xml/etree/ElementTree.py", line 707, in _write
self._write(file, n, encoding, namespaces)
File "/home/falsetru/t/Python-2.6/Lib/xml/etree/ElementTree.py", line 681, in _write
file.write("<" + _encode(tag, encoding))
TypeError: cannot concatenate 'str' and 'instance' objects
重现错误(Python 2.7,不同的错误消息):
>>> from xml.etree import ElementTree as ET
>>> allDepts = ET.Element('depts')
>>> ET.SubElement(allDepts, ET.Element('a'))
<Element <Element 'a' at 0xb745a8ec> at 0xb74601ac>
>>> with open('a', 'wb') as f:
... tree = ET.ElementTree(allDepts)
... tree.write(f)
...
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 817, in write
self._root, encoding, default_namespace
File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 886, in _namespaces
_raise_serialization_error(tag)
File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1052, in _raise_serialization_error
"cannot serialize %r (type %s)" % (text, type(text).__name__)
TypeError: cannot serialize <Element 'a' at 0xb745a8ec> (type Element)