So verarbeiten und ersetzen Sie Japanisch in einer Zeichenkette "http: //hogefuga/qiita.com" -> Durch das Ergebnis der Verarbeitung von "hogefuga" ersetzen
Richtige (?) Korrespondenz, wenn Sie eine URL einschließlich Japanisch in URLs von Urllib verwenden möchten Nachtrag: Ich habe es am Ende hinzugefügt, weil die Methode, auf die Sie hingewiesen haben, für diese Antwort korrekt zu sein schien.
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.
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.
@ 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
@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