XML-RPC Python客户端引发xml.parsers.expat.ExpatError异常
我正在尝试使用Python的xmlrpclib库进行XMP-RPC,但遇到了一些问题。
xml.parsers.expat.ExpatError: XML or text declaration not at start of entity: line 1, column 1
这是我用来传递参数的字典:
{'cliente_chave': 'hUi238sh328sjk37Hms8Kisjeg9',
'cliente_codigo': 164,
'imovel_bairro': u'Renascen\xe7a',
'imovel_banheiros': u'5',
'imovel_cidade': u'S\xe3o Lu\xeds - MA',
'imovel_codigo_imobiliaria': u'757',
'imovel_descricao': u'\n\t\t\t\n\t\t\tCasa em otima localiza\xe7\xe3o ideal tanto para empresas quanto para moradia tendo:\r\nTerra\xe7o\r\nSala Ampla para 03 ambientes\r\nLavabo\r\nHall\r\n03 su\xedtes\r\nEscritorio\r\nCozinha\r\nQuintaL\r\n\xc1rea de Servi\xe7o\r\nDCE\r\nGaragem coberta para 02 carros\r\nPort\xe3o eletronico\r\nCisterna\r\nNascente',
'imovel_estado': 'MA',
'imovel_negociacao': 'venda',
'imovel_novo': False,
'imovel_quartos': u'3',
'imovel_subtipo': u'padr\xe3o',
'imovel_suites': u'3',
'imovel_tipo': u'casa',
'imovel_vagas': u'2',
'imovel_valor': u' 480.000,00',
'url': 'http://www.estiloma.com.br/imoveis/para-venda/em-sao-luis/no-bairro-renascenca/casa-padrao/id-774.html'}
这是出现异常时的错误追踪信息:
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/Twisted-12.2.0-py2.7-macosx-10.8-intel.egg/twisted/internet/defer.py", line 551, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "/Users/bslima/Documents/Aptana Studio 3 Workspace/aqueleimovel/aqueleimovel/pipelines.py", line 31, in process_item
result = server.salvar_imovel(dict(item))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xmlrpclib.py", line 1224, in __call__
return self.__send(self.__name, args)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xmlrpclib.py", line 1575, in __request
verbose=self.__verbose
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xmlrpclib.py", line 1264, in request
return self.single_request(host, handler, request_body, verbose)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xmlrpclib.py", line 1297, in single_request
return self.parse_response(response)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xmlrpclib.py", line 1467, in parse_response
p.feed(data)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xmlrpclib.py", line 557, in feed
self._parser.Parse(data, 0)
xml.parsers.expat.ExpatError: XML or text declaration not at start of entity: line 1, column 1
我只使用UTF-8编码来处理字符串,尝试过对字符串进行编码或解码为UTF-8,但都没有成功。我也试着在网上搜索这个问题,但没有找到解决办法。有没有人遇到过类似的情况?
哦,这是我的客户端代码:
server = ServerProxy(uri=settings.RPC_SERVER, verbose=True)
server.salvar_imovel(item)
提前感谢大家的帮助。
正如我评论的那样,ExpatError出现在响应对象中。谢谢。
2 个回答
1
看起来你把一个 dict
对象传给了一个需要 XML
的地方——就是这一行
server.salvar_imovel(dict(item))
如果你真的需要传这个 dict
,你可以先把它转换成字符串。这里有一些示例代码 在这里。
6
[已解决] 响应开头有空格的问题。 我需要从xmlrpc扩展Transport类,并简单地去掉响应中的空格。
from xmlrpc.client import SafeTransport, Transport
from xmlrpc.client import GzipDecodedResponse
is_https = False
if is_https:
BaseTransport = SafeTransport
else:
BaseTransport = Transport
class CustomTransport(BaseTransport):
def parse_response(self, response):
# read response data from httpresponse, and parse it
# Check for new http response object, else it is a file object
if hasattr(response,'getheader'):
if response.getheader("Content-Encoding", "") == "gzip":
stream = GzipDecodedResponse(response)
else:
stream = response
else:
stream = response
p, u = self.getparser()
while 1:
data = stream.read(1024)
data = data.strip()
if not data:
break
if self.verbose:
print "body:", repr(data)
p.feed(data)
if stream is not response:
stream.close()
p.close()
return u.close()