2012-08-03 161 views
0

我试图使用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 
+0

可能我怎样才能使用请求库发送XML身体?(https://stackoverflow.com/questions/12509888/how-can-i-send-an-xml-body-using-requests-library) – 2017-10-27 17:59:10

回答

1

不是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转换您名为rootElementTreeElement

+0

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

+0

随着您使用的进口,我认为你需要'ET.tostring'。一定要把它叫做'root',而不是'tree';它适用于元素,而不是树。请参阅http://effbot.org/zone/pythondoc-elementtree-ElementTree.htm#elementtree.ElementTree.tostring-function – zigg 2012-08-03 19:58:52

+0

好吧,现在看起来好像我有一堆UTF-8编码的XML元素。我还在做'tree = ElementTree(root)'吗?因为我只是尝试发布该树并获得另一个'TypeError:必须可转换为缓冲区,而不是ElementTree'。 – bmay2 2012-08-03 20:50:02

0

它等待一个字符串的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) 
1

有一次,当我不得不做类似的事情,我不喜欢这样的:

requests.post(url, data=xml_string, headers={'Content-Type':'application/xml; charset=UTF-8'})