Python, ElementTree, fromstring UTF-8...

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Python, ElementTree, fromstring UTF-8...

Inlägg av sodjan »

Har lite strul med att "läsa" en XML struktur som kommer som en textmassa
till ett Python script. Tänkte används ElementTree och funktionen fromstring.

Miljö:
$ python
Python 2.7.8 (default, Oct 31 2014, 14:12:12) [DECC] on OpenVMS
Type "help", "copyright", "credits" or "license" for more information.
>>>

Har en 2.7.18 tillgänglig, men jag ser inte att ElementTree skulle bete sig annorlunda.
Det är samma version av ElementTree i båda...

Tree i båda Python versionerna.

Ungefär så här med lite rensad kod:

Kod: Markera allt

import xml.etree.ElementTree as ET
message = queue.get(None, md, gmo)
root = ET.fromstring(message)
Indata som läses av "queue.get" kommer via MQ från en IBM WebSphere miljö.

Problemet är att det förekommer speciella tecken kodade som UTF-8 i XML strukturen (som värden, inte som taggar).

Fromstring smäller av med:

Kod: Markera allt

Traceback (most recent call last):
  File "<stdin>", line 28, in <module>
  File "/python_root/lib/xml/etree/ElementTree.py", line 1300, in XML
    parser.feed(text)
  File "/python_root/lib/xml/etree/ElementTree.py", line 1642, in feed
    self._raiseerror(v)
  File "/python_root/lib/xml/etree/ElementTree.py", line 1506, in _raiseerror
    raise err
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 431, column 96
Rad 431 i XML datat ser ut så här (Två skärmkopior för att inte få strul med visningen här):
Skärmklipp.JPG
Skärmklipp2.JPG
Alltså ett vanligt "upphöjt 3'a" kodat med rätt UTF-8 kod "\xC2 \xB3".

Jag ser två vägar:
1. Köra en find/replace på hela "message" och ersätta UTF-8 koderna med valfritt ASCII tecken.
2. Få till det så att ElementTree kan hantera det även med UTF-8 som värden i XML strukturen.

Skulle gärna behålla UTF-8 för att få korrekta benämningar på prylarna i olika länder.

Så, tänkte om det fanns någon Python-hacker här som har en idé? :-)

Syftet är alltså att plocka vissa data från XML strukturen (är en nerladdning från ett centralt
system för artikelinformation) och lägga det som är intressant i våran lokala databas. Är inte
intresserad av XML som sådan, bara att få tag på relevant data.

Det finns ett par andra XML vertyg som BeautifulSoup, libxml2, lxml, och PySimpleXML
ifall någon känner igen någon av dessa och tror/vet att den skulle fungera bättre.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
swesysmgr
Inlägg: 14127
Blev medlem: 28 mars 2009, 06:56:43
Ort: Göteborg

Re: Python, ElementTree, fromstring UTF-8...

Inlägg av swesysmgr »

Kommer det ingen header med ditt xml-dokument som specificerar teckenuppsättning eller ignorerar din parser den informationen?

Kod: Markera allt

<?xml version="1.0" encoding="UTF-8"?>
Du kanske kan låta dit program lägga till detta innan filen skickas till ElementTree eller testa med DOM/sax parserna istället, de verkar finnas även i Python 2.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python, ElementTree, fromstring UTF-8...

Inlägg av sodjan »

XML'en är nog korrekt som sådan. Den används på många olika andra system. Första raderna:

Kod: Markera allt

<?xml version="1.0" encoding="UTF-8"?>
<STEP-ProductInformation ExportTime="2019-06-10 10:40:32".................
        <Qualifiers>
                <Qualifier ID="Qualifier root">
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python, ElementTree, fromstring UTF-8...

Inlägg av sodjan »

Det finns ingen "min" parser. Jag använder ElementTree som ingår i Python.
Men sedan så kan ju en "sträng" i Python (2) både vara av datatypen "string" eller "utf-8".
kan vara något sådant som strular... Kan vara så att ElementTree helt enkelt har
problem med att läsa en XML i UTF-8 encoding...
jeppe
Inlägg: 30
Blev medlem: 17 mars 2011, 23:48:14
Ort: Ulricehamn

Re: Python, ElementTree, fromstring UTF-8...

Inlägg av jeppe »

ET.parse(a_file) hanterar Unicode som standard, men nu har du ingen fil.
ET.fromstring(a_string) hanterar unicode först i Python version 3.x. Mer info här för den intresserade: https://bugs.python.org/issue11033
Testa att enkoda strängen själv först: ET.fromstring(a_string.encode('utf-8'))
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python, ElementTree, fromstring UTF-8...

Inlägg av sodjan »

Hm, jag har sett det där .encode('utf-8') men är inte helt säker på vad den gör.
Markerar den bara strängen som att "det här är en utf-8 sträng", eller gör
den något med innehållet också? Innehållet är ju redan OK, så att säga.
Den upphöjda trean ("kubikcentimeter") har ju redan rätt utf-8 kodning,
och det är det som ElementTree verkar klaga på, så vitt jag förstår... :humm:
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Python, ElementTree, fromstring UTF-8...

Inlägg av guckrum »

Lite trist att det är Python2, då det ju gick i pension för snart ett år sedan.
(Intresset för att fixa problem i obsoleta språk är antagligen begränsat.)
Om du inte sitter fast i legacykod kan det vara en bra ide' att köra Python3
och jobba med de problem som eventuellt dyker upp där istället.

I Python3 är alla strängar unicode, så det är mindre sådant att tänka på,
och det är väldigt bra!
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python, ElementTree, fromstring UTF-8...

Inlägg av sodjan »

Ingen Python 3 för denna plattform.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python, ElementTree, fromstring UTF-8...

Inlägg av sodjan »

Lite followup...
Jag bytte till lxml, men inte säkert att det var lösningen i sig.
Upptäckte några mindre "fel" i XML filen. Utf-8 koden som den klagade
på var en korrupt utf-8 kod. Efter att ha kopierat/FTP'at om filen så
hoppade det igång. Case closed. Nu handlar de bara om att tolka filen...
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Python, ElementTree, fromstring UTF-8...

Inlägg av guckrum »

Det mesta är roligare än att parsa XML, helt klart.
Skriv svar