Wenn Sie mit python3 mit urllib auf eine URL zugreifen, die Japanisch (japanische URL) enthält, wird diese willkürlich mit HTML codiert, und es tritt ein Fehler auf. Notieren Sie sich daher die Problemumgehung

Inhalt

Hintergrund

Stolpern Inhalt

response = urllib.request.urlopen(url)

es ist normal. Greifen Sie einfach auf die URL zu und erledigen Sie das Objekt. ___ Jedoch ___ Eine Tragödie ist passiert, weil diese URL Japanisch enthielt.

url = 'http: //image.search.yahoo.co.jp/search? p = Evangelion' Es ist wie es ist.

Sie werden mit Eile in die Dunkelheit von Python gezogen. *** Fehlerdetails hinzugefügt. *** ***

Traceback (most recent call last):
・ ・ ・
    response = urllib.request.urlopen(link)
  File "/Users/mix/.pyenv/versions/3.5.0/lib/python3.5/urllib/request.py", line 162, in urlopen
    return opener.open(url, data, timeout)
  File "/Users/mix/.pyenv/versions/3.5.0/lib/python3.5/urllib/request.py", line 465, in open
    response = self._open(req, data)
  File "/Users/mix/.pyenv/versions/3.5.0/lib/python3.5/urllib/request.py", line 483, in _open
    '_open', req)
  File "/Users/mix/.pyenv/versions/3.5.0/lib/python3.5/urllib/request.py", line 443, in _call_chain
    result = func(*args)
  File "/Users/mix/.pyenv/versions/3.5.0/lib/python3.5/urllib/request.py", line 1268, in http_open
    return self.do_open(http.client.HTTPConnection, req)
  File "/Users/mix/.pyenv/versions/3.5.0/lib/python3.5/urllib/request.py", line 1240, in do_open
    h.request(req.get_method(), req.selector, req.data, headers)
  File "/Users/mix/.pyenv/versions/3.5.0/lib/python3.5/http/client.py", line 1083, in request
    self._send_request(method, url, body, headers)
  File "/Users/mix/.pyenv/versions/3.5.0/lib/python3.5/http/client.py", line 1118, in _send_request
    self.putrequest(method, url, **skips)
  File "/Users/mix/.pyenv/versions/3.5.0/lib/python3.5/http/client.py", line 960, in putrequest
    self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 14-21: ordinal not in range(128)

Soweit ich den Fehler sehe, versucht ~~ urllib nur, in ASCII zu konvertieren, oder? ?? ?? ~~ PS: http hat versucht, die URL in ASCII zu konvertieren! !!

Problemumgehung Wo! Ich habe gesucht Der japanische Teil sollte analysiert werden ~~. ~~ Postscript: Sie sollten eine URL-Codierung (Prozentcodierung) durchführen.

urllib.parse.quote_plus('Evangelion', encoding='utf-8')

Ist es so Hier liegt ein Problem vor. .. ..

url = 'http://image.search.yahoo.co.jp/search?p=' + urllib.parse.quote_plus('Evangelion', encoding='utf-8')

Wenn Sie es ehrlich tun, wird es so sein. .. .. Sie können auch eine Zeichenfolge angeben, die beim Nachschlagen ausgeschlossen werden soll! Es scheint, dass Sie es als zweites Argument übergeben sollten.

urllib.parse.quote_plus(url, "/:?=&")

Ist es so Es kann einige Auslassungen in Zeichen geben, die nicht behandelt werden. .. .. Es hat damit funktioniert, aber ich war ein wenig besorgt, also gibt es eine andere Methode.

Im Gegenteil (?) Sollte ich alle Japaner ersetzen! Das habe ich versucht.

Was ich getan habe

Es ist verwirrend! Bei dieser Methode jedoch Wörter, die dem regulären Ausdruck entsprechen Sie können es ersetzen, "es an eine Funktion übergeben und das Ergebnis verwenden".

Ich wollte etwas dagegen tun, konnte es mir aber nicht als steifen Kopf vorstellen. .. .. Ich weiß nicht viel über Python, deshalb ist es auf den ersten Blick nicht gut. .. .. Es scheint, dass Lambda auch keine Nebenwirkungen hat. Bitte lassen Sie mich wissen, wenn es noch etwas gibt. Ist es ein Iterator?

regex = r'[Ah-Gaa-熙]'
matchedList = re.findall(regex,url)
for m in matchedList:
   url = url.replace(m, urllib.parse.quote_plus(m, encoding="utf-8"))

Wenn es um alle Japaner geht Es gibt viele Artikel, die sagen [A-n], Wenn man sich die Zeichencodetabelle ansieht, ist es wirklich "ga"!

damit! !! Selbst wenn Sie schmutzigen Code mit Python verfügbar machen, der überhaupt nicht vertraut ist Ich habe es geschrieben, weil ich diese letzte Überraschung teilen möchte.

Nachtrag: Richtige Spezifikationsmethode für reguläre Ausdrücke

@ KeisukeKudo-san hat mir einige Verbesserungsmaßnahmen gegeben, deshalb werde ich sie auch hier vorstellen! Genau genommen ist meine Notation undicht. Wenn Sie sie verwenden möchten, verwenden Sie bitte Folgendes.

regex = r'[Ah-Gaa-熙]'
#Das Obige wurde wie folgt geändert
regex = r'[^\x00-\x7F]'

Wie wäre es zu versuchen [\x00-\x7F] Dies ist ein regulärer Ausdruck, der dem ASCII-Zeichen entspricht. Wenn Sie das obige Negativformular verwenden, können Sie die Zeichen erhalten, die mit Japanisch übereinstimmen. http://rubular.com/r/2dnoBUlKe9

Nachtrag: Die korrekteste Methode für diese Antwort

@komeda-shinji hat mir einige Verbesserungsmaßnahmen gegeben, deshalb werde ich sie auch hier vorstellen! Überlegen Sie genau, was Sie tun möchten, wenn die URL-Abfrage Zeichen enthält, die nicht in ASCII konvertiert werden können Das Folgende ist besser, weil es bedeutet, dass die URL zuerst codiert wird.

Es wird durch die Komponente der URL zerlegt und nur die Abfrage wird URL-codiert und rekonstruiert.

from urllib.parse import urlparse
import urllib.request

url = 'http://image.search.yahoo.co.jp/search?p=Evangelion'
p = urlparse(url)
query = urllib.parse.quote_plus(p.query, safe='=&')
url = '{}://{}{}{}{}{}{}{}{}'.format(
    p.scheme, p.netloc, p.path,
    ';' if p.params else '', p.params,
    '?' if p.query else '', query,
    '#' if p.fragment else '', p.fragment)
response = urllib.request.urlopen(url)

Recommended Posts

Wenn Sie mit python3 mit urllib auf eine URL zugreifen, die Japanisch (japanische URL) enthält, wird diese willkürlich mit HTML codiert, und es tritt ein Fehler auf. Notieren Sie sich daher die Problemumgehung
Holen Sie sich mit Python den Aktienkurs eines japanischen Unternehmens und erstellen Sie eine Grafik
[Python] Wenn Sie eine Datei mit demselben Namen wie das zu importierende Modul erstellen, tritt ein Attributfehler auf.
Ich habe versucht, den Unterschied zwischen A + = B und A = A + B in Python herauszufinden
Wenn ich versuche, den Befehl make von Makefile mit os / exec von golang auszuführen, führen die zweite und nachfolgende Ausführung zu einem Fehler.
Ich bin auf einen Bildfilter mit einem eindeutig japanischen Namen namens Kuwahara-Filter gestoßen, und als ich ihn ausprobierte, war er erstaunlich, also werde ich ihn vorstellen.
[Python] Wäre es nicht das Beste und Höchste, wenn Sie die Unternehmensmerkmale mit nlplot erfassen könnten?
[Python] Vorsichtsmaßnahmen beim Ermitteln der Maximal- und Minimalwerte mit einem Numpy-Array mit einer kleinen Anzahl von Elementen
Machen Sie aus einem Python-Programm einen Daemon und führen Sie es automatisch aus, wenn das Betriebssystem gestartet wird
Sie werden in 100 Tagen Ingenieur - 29. Tag - Python - Grundlagen der Python-Sprache 5
Sie werden in 100 Tagen Ingenieur - Tag 33 - Python - Grundlagen der Python-Sprache 8
Sie werden in 100 Tagen Ingenieur - 26. Tag - Python - Grundlagen der Python-Sprache 3
Sie werden in 100 Tagen Ingenieur - Tag 32 - Python - Grundlagen der Python-Sprache 7
Sie werden in 100 Tagen Ingenieur - 28. Tag - Python - Grundlagen der Python-Sprache 4
Eine Einführung in die GUI-Software der Klassenplattform, die mit Python / Tkinter erstellt wurde! (Und viele Try and Error)! (Während des Schreibens)
[Hinweis] Exportieren Sie das HTML der Site mit Python.
Kopieren Sie die Liste in Python
Das Ergebnis der Erstellung eines Kartenalbums italienischer Jungvermählten in Python und dessen Weitergabe
Ich mag es nicht, mit der Veröffentlichung von Pokemon Go frustriert zu sein, deshalb habe ich ein Skript erstellt, um die Veröffentlichung zu erkennen und zu twittern
Ein Skript, das den registrierten Server anpingt und eine bestimmte Anzahl von E-Mails mit Google Mail sendet, wenn dies fehlschlägt
Ich habe python3.4 in .envrc mit direnv geschrieben und es zugelassen, aber ich habe einen Syntaxfehler erhalten
Notieren Sie sich, was Sie in Zukunft mit Razpai machen möchten
Beim Lesen eines Bildes mit SimpleITK tritt ein Problem auf, wenn sich Japanisch im Pfad befindet
Rufen Sie die Excel-Liste rekursiv in einem bestimmten Ordner mit Python ab und schreiben Sie sie in Excel.
VisibleDeprecationWarning: Die Verwendung einer Nicht-Ganzzahl anstelle einer Ganzzahl führt in Zukunft zu einem Fehler
Geben Sie die Bilddaten mit Flask of Python zurück und zeichnen Sie sie in das Canvas-Element von HTML
Eine einfache Möglichkeit, die in Python benötigte Zeit anzuzeigen und sie intelligenter zu verbessern
Vorsichtsmaßnahmen bei der Eingabe von CSV mit Python und der Ausgabe an json, um exe zu erstellen
So schreiben Sie, wenn Sie eine Zahl nach der Gruppennummer setzen möchten, die durch einen regulären Ausdruck in Python ersetzt werden soll