XML POST与Python请求
我试图使用uClassify API根据文本对对象进行分类。为了与API交互,我需要让XML POST请求,如:XML POST与Python请求
<?xml version="1.0" encoding="utf-8" ?>
<uclassify xmlns="http://api.uclassify.com/1/RequestSchema" version="1.01">
<writeCalls writeApiKey="YOUR_WRITE_API_KEY_HERE" classifierName="ManOrWoman">
<create id="CreateManOrWoman"/>
</writeCalls>
</uclassify>
我试图做到这一点使用HTTP请求模块以及xml.etree.ElementTree创建一个XML树,但我我左右都是错误的。下面是一些代码我想:
>>> import elementtree.ElementTree as ET
>>> from xml.etree.cElementTree import Element, ElementTree
>>> import requests
>>>
>>> root = ET.Element("uclassify", xlms="http://api.uclassify.com/1/RequestSchema", version="1.01")
>>> head = ET.SubElement(root, "writeCalls", writeApiKey="*************", classifierName="test")
>>> action = ET.SubElement(head, "create", id="CreateTest")
>>> tree = ElementTree(root)
>>>
>>> r = requests.post('http://api.uclassify.com/', tree)
>>>
>>> ........
>>> TypeError: must be convertible to a buffer, not ElementTree
不是requests
方法,但这里是一个真正的简单配方使用urllib2
从我的代码库:
import urllib2
from elementtree import ElementTree
def post(url, data, contenttype):
request = urllib2.Request(url, data)
request.add_header('Content-Type', contenttype)
response = urllib2.urlopen(request)
return response.read()
def postxml(url, elem):
data = ElementTree.tostring(elem, encoding='UTF-8')
return post(url, data, 'text/xml')
我怀疑什么你缺少的是使用tostring
转换您名为root
的ElementTree
Element
。
I尝试过'ElementTree.tostring(tree,encoding ='UTF-8')'但出现错误:'AttributeError:type object'ElementTree'没有属性'tostring'' 所以我尝试'xml.etree.ElementTree.tostring(tree,encoding ='UTF-8')'并得到'AttributeError:_ElementInterface实例没有属性'iter'。 – bmay2 2012-08-03 19:47:42
随着您使用的进口,我认为你需要'ET.tostring'。一定要把它叫做'root',而不是'tree';它适用于元素,而不是树。请参阅http://effbot.org/zone/pythondoc-elementtree-ElementTree.htm#elementtree.ElementTree.tostring-function – zigg 2012-08-03 19:58:52
好吧,现在看起来好像我有一堆UTF-8编码的XML元素。我还在做'tree = ElementTree(root)'吗?因为我只是尝试发布该树并获得另一个'TypeError:必须可转换为缓冲区,而不是ElementTree'。 – bmay2 2012-08-03 20:50:02
它等待一个字符串的XML,尝试这样的事情(使用请求):
input_string_xml = ElementTree.tostring(tree, encoding='utf8', method='xml')
param_data = {'xml': input_xml}
output_xml = requests.post("http://api.uclassify.com/", data=param_data)
有一次,当我不得不做类似的事情,我不喜欢这样的:
requests.post(url, data=xml_string, headers={'Content-Type':'application/xml; charset=UTF-8'})
可能我怎样才能使用请求库发送XML身体?(https://stackoverflow.com/questions/12509888/how-can-i-send-an-xml-body-using-requests-library) – 2017-10-27 17:59:10