Michał Sadowski

Michał Sadowski programista (*SQL,
Python)

Temat: suds i polskie znaki w XML

Witam,

Próbuję za pomocą suds skorzystać z webservices pewnej firmy. Cały problem polega na tym, że Ktoś Mądry wymyślił w XML, który dostaję w odpowiedzi tagi w rodzaju
<Błąd></Błąd>
, tj. zawierające polskie "ogonki" przez co suds się wysypuje (poniżej stactrace).

Czy ktoś miał już takie przygody? czy da się to jakoś ominąć, ewentualnie z czego zamiast suds mógłbym skorzystać? Bez bicia mówię, że z webservices nie miałem wcześniej do czynienia.


C:\temp>c:\python26\python test.py
Traceback (most recent call last):
File "test.py", line 22, in <module>
result = client.service.NazwaMetody(foo="bar")
File "c:\python26\lib\site-packages\suds-0.4-py2.6.egg\suds\client.py", line 542, in __call__
File "c:\python26\lib\site-packages\suds-0.4-py2.6.egg\suds\client.py", line 602, in invoke
File "c:\python26\lib\site-packages\suds-0.4-py2.6.egg\suds\client.py", line 643, in send
File "c:\python26\lib\site-packages\suds-0.4-py2.6.egg\suds\client.py", line 678, in succeeded
File "c:\python26\lib\site-packages\suds-0.4-py2.6.egg\suds\bindings\binding.py", line 165, in get_reply
File "c:\python26\lib\site-packages\suds-0.4-py2.6.egg\suds\umx\typed.py", line 66, in process
File "c:\python26\lib\site-packages\suds-0.4-py2.6.egg\suds\umx\core.py", line 48, in process
File "c:\python26\lib\site-packages\suds-0.4-py2.6.egg\suds\umx\core.py", line 63, in append
File "c:\python26\lib\site-packages\suds-0.4-py2.6.egg\suds\umx\core.py", line 155, in append_children
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128)
Michał Sadowski edytował(a) ten post dnia 04.10.10 o godzinie 12:33
Bartłomiej Ogryczak

Bartłomiej Ogryczak Backend Developer @
Layar

Temat: suds i polskie znaki w XML

A w XML-u jest zadeklarowane kodowanie? Dajmy na to:
<?xml version="1.0" encoding="ISO-8859-2"?>
Michał Sadowski

Michał Sadowski programista (*SQL,
Python)

Temat: suds i polskie znaki w XML

cytując dokładnie jest:
<?xml version="1.0" encoding="utf-8"?>


Nie wiem do czego zmierzasz, ale IMO problemem są polskie znaki w *znacznikach*...
Michał Jastrzębski

Michał Jastrzębski Django-fu, phpjutsu,
sql-do

Temat: suds i polskie znaki w XML

Domyślnie python nie rozumie kodowania nie-ascii

Spróbuj wstawić tą linijkę na początku kodu pythona:

# -*- coding: utf-8 -*-
Michał Sadowski

Michał Sadowski programista (*SQL,
Python)

Temat: suds i polskie znaki w XML

Ech...

Kod głównego skryptu jest (jak zawsze w moim przypadku) w utf-8. Tak już mam.

Przeglądałem paczkę suds-xxx.egg (wersji nie pomnę), nie znalazłem w plikach .py informacji o kodowaniu. Spróbuję jutro, ale nie sądzę, aby to coś dało.

Moje pytanie dotyczyło raczej wypracowanych strategii obchodzenia się z takimi dziwnymi plikami XML, czy to przy użyciu pakietu suds czy innego.

Może z innej beczki: jeżeli uda mi się pobrać za pomocą suds takiego popapranego XMLa to już dalej sobie poradzę.

Jakieś pomysły na workaround?

Temat: suds i polskie znaki w XML

spróbuj coś takiego:
# cat /usr/lib/python2.7/sitecustomize.py
# sitecustomize.py
# this file can be anywhere in your Python path,
# but it usually goes in ${pythondir}/lib/site-packages/

import sys

sys.setdefaultencoding('utf-8')

konto usunięte

Temat: suds i polskie znaki w XML

Kodowanie plików kodu źródłowego nijak ma się do kodowania przetwarzanych dokumentów - odpuść więc sobie sprawdzanie podpowiedzi kolegów.

Nie odpowiem Ci wprost co jest nie tak, ale mogę napisać jak ja bym spróbował ustalić w czym leży problem.

1. Zacząłbym od sprawdzenia, czy w nazwach tagów mogą znajdować się znaki spoza ASCII - w XML mogą (to wiem na pewno), w SOAP zakładam, że też (choć pewności nie mam, warto by sprawdzić).
2. Sprawdziłbym jakie kodowanie pliku powinien widzieć klient. Nie - nie jest ono koniecznie zdeterminowane przez kodowanie podane w preambule XML co sugeruje Bartłomiej. Rozumiem, że ten SOAP przesyłany jest HTTP, a w takim przypadku pierwszeństwo ma parametr charset w nagłówku Content-Type. Jeśli go nie ma (parametru bądź nagłówka) to AFAIK dopiero wtedy klient może ustalić kodowanie na podstawie BOM, preambuły, lub na podstawie ustalonego domyślnego kodowania dla media-type. Nie wiem w jakiej kolejności działa to dla XML - warto sprawdzić.
3. Porównanie, czy kodowanie jakie powinien (w teorii) rozpoznać klient zgadza się z faktycznym kodowaniem pliku:
3a) Nie zgadza się - wina tego "po drugiej stronie". Albo zwracasz mu uwagę i wymuszasz na nim poprawę, albo naprawiasz "po swojej stronie" i bierzesz pod uwagę ewentualne tego konsekwencje które mogą wystąpić w przyszłości (bo ktoś "po drugiej stronie" może rzecz naprawić i Twój workaround przestanie działać)
3b) Wszystko się zgadza - błąd po stronie klienta.

Błąd po stronie klienta może być spowodowany:
- błędną detekcją kodowania pliku (być może da się wymusić prawidłowe, co jednak nie jest w pełni prawidłowym rozwiązaniem problemu)
- błędami parsowania (tu błąd może leżeć w bibliotece suds lub może być to błąd parsera z którego ów biblioteka korzysta).

IMHO w obu przypadkach absolutnie powinieneś zgłosić ten fakt twórcom biblioteki.Tomasz Elendt edytował(a) ten post dnia 04.10.10 o godzinie 23:02
Michał Jastrzębski

Michał Jastrzębski Django-fu, phpjutsu,
sql-do

Temat: suds i polskie znaki w XML

Swojego czasu miałem dość dużo problemów z kodowaniem w py.

1. http://evanjones.ca/python-utf8.html

2. jeśli kod wyglądał tak:

print "ąężź"
czyli polskie znaki są w pliku z kodem, moje rozwiązanie może pomóc. do tego:
print u"ąęźż"


Python domyślnie krzaczy się nawet, jak masz ogonki w komentarzach
Bartłomiej Ogryczak

Bartłomiej Ogryczak Backend Developer @
Layar

Temat: suds i polskie znaki w XML

Michał Sadowski:
Nie wiem do czego zmierzasz, ale IMO problemem są polskie znaki w *znacznikach*...

OK, ale akurat w XML-u mają prawo być.Bartłomiej Ogryczak edytował(a) ten post dnia 05.10.10 o godzinie 10:08
Michał Sadowski

Michał Sadowski programista (*SQL,
Python)

Temat: suds i polskie znaki w XML

Tomasz Elendt:
1. Zacząłbym od sprawdzenia, czy w nazwach tagów mogą znajdować się znaki spoza ASCII - w XML mogą (to wiem na pewno), w SOAP zakładam, że też (choć pewności nie mam, warto by sprawdzić).

Zawsze mi się wydawało, że to błąd, ale zakładam, że jeśli w XML są one legalne to w SOAP też.
2. Sprawdziłbym jakie kodowanie pliku powinien widzieć klient. (...) Rozumiem, że ten SOAP przesyłany jest HTTP, a w takim przypadku pierwszeństwo ma parametr charset w nagłówku Content-Type.

Tak w nagłówku http jak i xml jest utf-8. Tak więc błąd leży po stronie suds.
IMHO w obu przypadkach absolutnie powinieneś zgłosić ten fakt twórcom biblioteki.

Tak też zrobię.

Jak pisałem wcześniej, skoro suds nie daje rady, wolałbym się skupić na parsowaniu XMLa poza suds (wiem, czym to grozi). Nie mam jednak pojęcia jak wyczesać z sudsa XMLa z treścią odpowiedzi.

konto usunięte

Temat: suds i polskie znaki w XML

Podobno odpowiedź jest na http://stackoverflow.com/questions/2953651/python-unic...

Zła nowina: trzeba łatać suds. Dobra nowina: po załataniu nie ma potrzeby migrować cały kod w cokolwiek innego.

Sam błąd znajduje się w suds/client.py, metoda send() (w bieżącej wersji to około linii 635). Kiedy klient wysyła zapytanie, to koduje je w utf8:

soapenv = soapenv.encode('utf-8')


Potem, jednak, przyjęta odpowiedź jest obrabiana na surowo:

            reply = transport.send(request)
ctx = plugins.message.received(reply=reply.message)
reply.message = ctx.reply
if retxml:
result = reply.message
else:
result = self.succeeded(binding, reply.message)

Sądzę, że musi być w powyższym fragmencie albo
            ctx = plugins.message.received(reply=reply.message.decode('utf-8'))

albo
            reply.message = ctx.reply.decode('utf-8')

Oczywiście, że w prawdziwym rozwiązaniu zamiast twardego 'utf-8' musi być charset, odczytany z nagłówków odpowiedzi.

Sprawdzić, czy zadziała, nie mam jak, bo nie miałem możliwości marudzić się z testowaniem tego wszystkiego; autor postu jednak ma już gotowy kod i gotowy serwer, toteż mu będzie łatwiej.

Hope that helps.Jarosław Fedewicz edytował(a) ten post dnia 06.10.10 o godzinie 01:18
Marcin Lulek

Marcin Lulek Programista -
WebReactor

Temat: suds i polskie znaki w XML

zapraszam na #suds na freenodzie, developer SUDS jest calkiem milym gosciem i nam zalatal oprogramowanie jak zglosilismy problemy w trackerze.

Zgloscie buga i powinien problem zostac rozwiazany dla wszystkich.

Następna dyskusja:

matplotlib - polskie znaki




Wyślij zaproszenie do