2013-04-05 26 views
17

Đang cố gắng để làm như sau ...chuỗi với khai mã hóa XML Unicode không được hỗ trợ

from lxml import etree 
from lxml.etree import fromstring 

if request.POST: 
    parser = etree.XMLParser(ns_clean=True, recover=True) 
    h = fromstring(request.POST['xml'], parser=parser) 
    return HttpResponse(h.cssselect('itagg_delivery_receipt status').text_content()) 

nhưng nó cung cấp cho lỗi này:

[Fri Apr 05 10:27:54 2013] [error] Internal Server Error: /sms/status_postback/ 
[Fri Apr 05 10:27:54 2013] [error] Traceback (most recent call last): 
[Fri Apr 05 10:27:54 2013] [error] File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 115, in get_response 
[Fri Apr 05 10:27:54 2013] [error]  response = callback(request, *callback_args, **callback_kwargs) 
[Fri Apr 05 10:27:54 2013] [error] File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/csrf.py", line 77, in wrapped_view 
[Fri Apr 05 10:27:54 2013] [error]  return view_func(*args, **kwargs) 
[Fri Apr 05 10:27:54 2013] [error] File "/srv/project/livewireSMS/sms/views.py", line 42, in update_delivery_status 
[Fri Apr 05 10:27:54 2013] [error]  h = fromstring(request.POST['xml'], parser=parser) 
[Fri Apr 05 10:27:54 2013] [error] File "lxml.etree.pyx", line 2754, in lxml.etree.fromstring (src/lxml/lxml.etree.c:54631) 
[Fri Apr 05 10:27:54 2013] [error] File "parser.pxi", line 1569, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:82659) 
[Fri Apr 05 10:27:54 2013] [error] ValueError: Unicode strings with encoding declaration are not supported. 

đây là XML

<?xml version="1.1" encoding="ISO-8859-1"?> 
<itagg_delivery_receipt> 
<version>1.0</version> 
<msisdn>447889000000</msisdn> 
<submission_ref> 
845tgrgsehg394g3hdfhhh56445y7ts6</ 
submission_ref> 
<status>Delivered</status> 
<reason>4</reason> 
<timestamp>20050709120945</timestamp> 
<retry>0</retry> 
</itagg_delivery_receipt> 

Tôi không có quyền kiểm soát tài liệu xml này đến từ công ty SMS.

+0

Từ FAQ lxml: [* Tại sao lxml không thể phân tích cú pháp XML của tôi từ các chuỗi unicode? *] (Http://lxml.de/FAQ.html#why-can-t-lxml-parse-my-xml-from-unicode-strings) –

+0

Có thể trùng lặp của [phân tích cú pháp tệp XML được UnicodeEncodeError (ElementTree)/ValueError (lxml)] (https://stackoverflow.com/questions/15622027/parsing-xml-file -gets-unicodeencodeerror-elementtree-valueerror-lxml) –

Trả lời

28

Bạn sẽ phải mã hóa nó và sau đó buộc các mã hóa tương tự trong phân tích cú pháp:

from lxml import etree 
from lxml.etree import fromstring 

if request.POST: 
    xml = request.POST['xml'].encode('utf-8') 
    parser = etree.XMLParser(ns_clean=True, recover=True, encoding='utf-8') 
    h = fromstring(xml, parser=parser) 

    return HttpResponse(h.cssselect('delivery_reciept status').text_content()) 
+0

Ví dụ độc lập có thể được cung cấp khi dữ liệu XML được xác định trong mã không? –

7

Các giải pháp sau đây từ kernc làm việc cho tôi:

>>> from lxml import etree 
>>> xml = u'<?xml version="1.0" encoding="utf-8" ?><foo><bar/></foo>' 
>>> xml = bytes(bytearray(xml, encoding='utf-8')) # ADDENDUM OF THIS LINE (when unicode means utf-8, e.g. on Linux) 
>>> etree.XML(xml) 
<Element html at 0x5b44c90> 
+0

Thú vị. Ngay cả sau khi đọc [trang] (https://gist.github.com/karlcow/3258330#gistcomment-769151) gợi ý cách giải quyết, tôi vẫn bỏ lỡ lý do tại sao giải mã không thành công ...: S – Pintun

Các vấn đề liên quan