Skip to main content
 首页 » 编程设计

python之XML-RPC python 客户端引发 xml.parsers.expat.ExpatError 异常

2025年05月04日17kuangbin

我正在尝试使用 xmlrpclib python 的库来执行 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 在响应对象中。谢谢

请您参考如下方法:

[已解决] 发送的响应开头带有空格。 我必须从 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()