Home > database >  Wikipedia API returns encoded text for foreign language
Wikipedia API returns encoded text for foreign language

Time:09-23

I am trying to get some data from a Wikipedia page. I use this URL to get the data:

https://el.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=δίας

You can open the URL with your browser to see how it looks.

My problem is that the data is encoded and I don't know how to decode them from my android app.

What I have tried so far:

URLDecoder.decode(articleText, "utf-8");

and

 byte [] barr = Base64.getDecoder().decode(articleText);
 Print.e("Decoded value is "   new String(barr));

and

 byte [] barr =  Base64.getMimeDecoder().decode(articleText);
 Print.e("Decoded value is "   new String(barr));

All failed. The first one didn't change anything.

The second crashes with log:

java.lang.IllegalArgumentException: Illegal base64 character 5c

The third crashes with log:

java.lang.IllegalArgumentException: Last unit does not have enough valid bits

Please note that I only try to decode the encoded text and not all the JSON text.

Any ideas?

CodePudding user response:

That's just a JSON response, even though using escape sequences in a JSON response like this is unusual.

You don't need to decode anything. Any character in a JSON string value can be replaced by a Unicode escape sequence. Parsing the JSON string will return the actual characters.

Those escape sequences are valid in Python too.

print('\u0394\u03af\u03b1\u03c2 \u03a7\u03b1\u03ca\u03b4\u03b1\u03c1\u03af\u03bf\u03c5 - \u03b1\u03b8\u03bb\u03b7\u03c4\u03b9\u03ba\u03cc\u03c2 ')
>>> 'Δίας Χαϊδαρίου - αθλητικός '

This:

import requests
url="https://el.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=δίας"
source = requests.get(url).json()
print(source)

Produces

{'batchcomplete': '', 'query': {'normalized': [{'from': 'δίας', 'to': 'Δίας'}], 'pages': {'18786': {'pageid': 18786, 'ns': 0, 'title': 'Δίας', 'extract': 'Το όνομα Δίας μπορεί να αναφέρεται στα παρακάτω:\n\nΜυθολογίαΟ Δίας (μυθολογία) - πατέρας των θεών της ελληνικής μυθολογίας.ΑστρονομίαΟ Δίας (πλανήτης) - ο μεγαλύτερος πλανήτης του ηλιακού συστήματος.\nΔίας LI - φυσικός δορυφόρος του πλανήτη Δία.\nΔίας LII - φυσικός δορυφόρος του πλανήτη Δία.\nΚαυτός Δίας - ονομασία κατηγορίας εξωηλιακών πλανητών.ΤέχνηΔίας του Οτρίκολι - μνημειώδης προτομή του ομωνύμου αρχαίου θεού.\nΔίας και Γανυμήδης - γλυπτό που εκτίθεται στο Αρχαιολογικό Μουσείο Ολυμπίας.\nΔίας και Θέτις - πίνακας του Γάλλου ζωγράφου Ζαν Ωγκύστ Ντομινίκ Ενγκρ.ΑθλητισμόςΑ.Σ. Δίας Πατρών - αθλητικός σύλλογος μπέιζμπολ\nΠ.Σ. Δίας Δίου - ποδοσφαιρικός σύλλογος\nΑ.Ο. Δίας Κορυδαλλού - αθλητικός όμιλος\nΑ.Ο. Δίας Σαραβαλίου - αθλητικός όμιλος\nΑ.Σ. Δίας Κωστακιών - αθλητικός σύλλογος\nΑ.Ο. Δίας Ηρακλείου - αθλητικός όμιλος\nΠ.Α.Σ. Δίας Αγίου Δημητρίου - πολιτιστικός αθλητικός σύλλογος\nΠ.Α.Σ. Δίας Κασσιώπης - ποδοσφαιρικός αθλητικός σύλλογος\nΑ.Ο. Δίας Ολυμπιακού Χωριού - αθλητικός όμιλος\nΑ.Σ. Δίας Χαϊδαρίου - αθλητικός σύλλογος\nΑ.Ο. Δίας Αχαρνών - αθλητικός όμιλος'}}}}

And

source['query']['pages']['18786']['extract']

Prints

'Το όνομα Δίας μπορεί να αναφέρεται στα παρακάτω:\n\nΜυθολογίαΟ Δίας (μυθολογία) - πατέρας των θεών της ελληνικής μυθολογίας.ΑστρονομίαΟ Δίας (πλανήτης) - ο μεγαλύτερος πλανήτης του ηλιακού συστήματος.\nΔίας LI - φυσικός δορυφόρος του πλανήτη Δία.\nΔίας LII - φυσικός δορυφόρος του πλανήτη Δία.\nΚαυτός Δίας - ονομασία κατηγορίας εξωηλιακών πλανητών.ΤέχνηΔίας του Οτρίκολι - μνημειώδης προτομή του ομωνύμου αρχαίου θεού.\nΔίας και Γανυμήδης - γλυπτό που εκτίθεται στο Αρχαιολογικό Μουσείο Ολυμπίας.\nΔίας και Θέτις - πίνακας του Γάλλου ζωγράφου Ζαν Ωγκύστ Ντομινίκ Ενγκρ.ΑθλητισμόςΑ.Σ. Δίας Πατρών - αθλητικός σύλλογος μπέιζμπολ\nΠ.Σ. Δίας Δίου - ποδοσφαιρικός σύλλογος\nΑ.Ο. Δίας Κορυδαλλού - αθλητικός όμιλος\nΑ.Ο. Δίας Σαραβαλίου - αθλητικός όμιλος\nΑ.Σ. Δίας Κωστακιών - αθλητικός σύλλογος\nΑ.Ο. Δίας Ηρακλείου - αθλητικός όμιλος\nΠ.Α.Σ. Δίας Αγίου Δημητρίου - πολιτιστικός αθλητικός σύλλογος\nΠ.Α.Σ. Δίας Κασσιώπης - ποδοσφαιρικός αθλητικός σύλλογος\nΑ.Ο. Δίας Ολυμπιακού Χωριού - αθλητικός όμιλος\nΑ.Σ. Δίας Χαϊδαρίου - αθλητικός σύλλογος\nΑ.Ο. Δίας Αχαρνών - αθλητικός όμιλος'

Notice that I used the original Greek parameter values in the URL string. Python 3 strings are Unicode, so there's no need to escape non-English text.

This is unusual

Using escape sequences for all characters is unusual. The HTTP response contains Content-Type: application/json; charset=utf-8 which clearly says the content is UTF8 characters. There's no need to escape them at all.

source = requests.get(url)
print(source.encoding)
>>> 'utf-8'

The API's JSON parameters offer a way to receive the text without encoding, by adding the utf8=true parameter. This URL (https://el.wikipedia.org/w/api.php?format=json&utf8=true&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=δίας) returns the strings unescaped.

Using

url="https://el.wikipedia.org/w/api.php?format=json&utf8=true&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=δίας"
source = requests.get(url)
print(source.text)

Shows that the response text is no longer escaped:

{"batchcomplete":"","query":{"normalized":[{"from":"δίας","to":"Δίας"}],"pages":{"18786":{"pageid":18786,"ns":0,"title":"Δίας","extract":"Το όνομα Δίας μπορεί να αναφέρεται στα παρακάτω:\n\nΜυθολογίαΟ Δίας (μυθολογία) - πατέρας των θεών της ελληνικής μυθολογίας.ΑστρονομίαΟ Δίας (πλανήτης) - ο μεγαλύτερος πλανήτης του ηλιακού συστήματος.\nΔίας LI - φυσικός δορυφόρος του πλανήτη Δία.\nΔίας LII - φυσικός δορυφόρος του πλανήτη Δία.\nΚαυτός Δίας - ονομασία κατηγορίας εξωηλιακών πλανητών.ΤέχνηΔίας του Οτρίκολι - μνημειώδης προτομή του ομωνύμου αρχαίου θεού.\nΔίας και Γανυμήδης - γλυπτό που εκτίθεται στο Αρχαιολογικό Μουσείο Ολυμπίας.\nΔίας και Θέτις - πίνακας του Γάλλου ζωγράφου Ζαν Ωγκύστ Ντομινίκ Ενγκρ.ΑθλητισμόςΑ.Σ. Δίας Πατρών - αθλητικός σύλλογος μπέιζμπολ\nΠ.Σ. Δίας Δίου - ποδοσφαιρικός σύλλογος\nΑ.Ο. Δίας Κορυδαλλού - αθλητικός όμιλος\nΑ.Ο. Δίας Σαραβαλίου - αθλητικός όμιλος\nΑ.Σ. Δίας Κωστακιών - αθλητικός σύλλογος\nΑ.Ο. Δίας Ηρακλείου - αθλητικός όμιλος\nΠ.Α.Σ. Δίας Αγίου Δημητρίου - πολιτιστικός αθλητικός σύλλογος\nΠ.Α.Σ. Δίας Κασσιώπης - ποδοσφαιρικός αθλητικός σύλλογος\nΑ.Ο. Δίας Ολυμπιακού Χωριού - αθλητικός όμιλος\nΑ.Σ. Δίας Χαϊδαρίου - αθλητικός σύλλογος\nΑ.Ο. Δίας Αχαρνών - αθλητικός όμιλος"}}}}

  • Related