2012-08-03 242 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'})