2013-03-03 50 views
1

我想使用的xmlrpclib蟒蛇的lib做XMP-RPC,但我越来越XML-RPC客户端蟒提高xml.parsers.expat.ExpatError例外

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字符串

,我已经TR如果没有运气,可以编码或解码为UTF-8。 我也尝试谷歌它,但没有sucsess。有人看到了吗?

哇,这里的客户端代码:

server = ServerProxy(uri=settings.RPC_SERVER, verbose=True) 
server.salvar_imovel(item) 

感谢提前的帮助。

正如我评论,ExpatError是在响应对象。由于

+0

我注意到在回溯中,问题出在响应中,而不是在请求中。我会调查回应,看看发生了什么。谢谢@danodonovan – bslima 2013-03-03 22:53:10

回答

1

你似乎在传递一个dict对象的东西期待XML - 这条线

server.salvar_imovel(dict(item)) 

如果你真的必须传中dict,你可以尝试序列化dict第一。有一些示例代码here

+0

我注意到在回溯中,问题出在响应中,而不是在请求中。我会调查回应,看看发生了什么。谢谢@danodonovan – bslima 2013-03-05 02:23:25

4

[已解决]响应是在开头用空格发送的。 我不得不从xmlrpc扩展Transport类,并简单地删除响应。

class CustomTransport(Transport): 
    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() 
+1

小备注:要调用HTTPS服务器上的方法,我必须通过SafeTransport而不是Transport,否则调用的是http:// URL,而不是https://。要使用它,不要忘记从xmlrpclib导入Transport(或SafeTransport)和GzipDecodedResponse。在我的情况下,这允许我在Drupal XML-RPC响应开始时去除额外的“\ n”。 – FGM 2014-08-29 10:15:51