Comment traiter et remplacer le japonais dans une chaîne de caractères "http: //hogefuga/qiita.com" -> Remplacer par le résultat du traitement de "hogefuga"
Correspondance correcte (?) Lorsque vous souhaitez utiliser une URL comprenant le japonais dans urlonen de urllib Addendum: Je l'ai ajouté à la fin car la méthode que vous avez indiquée semblait être correcte pour cette réponse.
response = urllib.request.urlopen(url)
c'est normal. Accédez simplement à l'url et faites l'objet. ___ Cependant, une tragédie s'est produite parce que cette URL contenait du japonais.
url = 'http: //image.search.yahoo.co.jp/search? p = Evangelion' C'est comme ça.
Vous serez entraîné dans les ténèbres de python avec hâte. *** Ajout des détails d'erreur. *** ***
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)
Pour autant que je vois l'erreur, ~~ urllib essaie juste de se convertir en ASCII, non? ?? ?? ~~ PS: http essayait de convertir l'URL en ascii! !!
Solution de contournement Où! J'ai cherché La partie japonaise doit être analysée ~~. ~~ Post-scriptum: vous devez effectuer un encodage d'URL (encodage en pourcentage).
urllib.parse.quote_plus('Evangelion', encoding='utf-8')
C'est comme ça? Il y a un problème avec cela. .. ..
url = 'http://image.search.yahoo.co.jp/search?p=' + urllib.parse.quote_plus('Evangelion', encoding='utf-8')
Si vous le faites honnêtement, ce sera comme ça. .. .. Vous pouvez également spécifier une chaîne de caractères à exclure lorsque vous la recherchez! Il semble que vous devriez le passer comme deuxième argument.
urllib.parse.quote_plus(url, "/:?=&")
C'est comme ça? Il peut y avoir des omissions dans les caractères qui ne sont pas couverts. .. .. Cela a fonctionné avec cela, mais j'étais un peu inquiet, il existe donc une autre méthode.
Au contraire (?) Je devrais remplacer tous les japonais! J'ai essayé de faire ça.
C'est confu! Cependant, avec cette méthode, les mots qui correspondent à l'expression régulière Vous pouvez le remplacer "le passer à une fonction et utiliser le résultat".
Je voulais faire quelque chose à ce sujet, mais je ne pouvais pas penser que c'était une tête raide. .. .. Je ne sais pas grand-chose sur python, donc ce n'est pas bon à première vue. .. .. Il semble que lambda n'ait pas non plus d'effets secondaires. S'il vous plaît laissez-moi savoir s'il y a autre chose. Est-ce un itérateur?
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"))
Quand il s'agit de tous les japonais De nombreux articles disent [A-n], En regardant la table des codes de caractères, c'est vraiment "ga"!
alors! !! Même si vous exposez du code sale avec python qui n'est pas du tout familier Je l'ai écrit parce que je veux partager cette dernière surprise.
@ KeisukeKudo-san m'a donné quelques mesures d'amélioration, je vais donc les présenter ici aussi! Strictement parlant, ma notation est fuyante, donc si vous voulez l'utiliser, veuillez utiliser ce qui suit.
regex = r'[Ah-Gaa-熙]' #Modifié ce qui précède comme suit regex = r'[^\x00-\x7F]'
Que diriez-vous d'essayer [\x00-\x7F] Il s'agit d'une expression régulière qui correspond au caractère ascii. En utilisant la forme négative ci-dessus, vous pouvez obtenir les caractères qui correspondent au japonais. http://rubular.com/r/2dnoBUlKe9
@ komeda-shinji m'a donné quelques mesures d'amélioration, je vais donc les présenter ici aussi! Penser spécifiquement à ce que vous voulez faire, quand il y a des caractères dans la requête URL qui ne peuvent pas être convertis en ascii Ce qui suit est préférable car cela signifie que l'URL est encodée en premier.
Il est décomposé par le composant d'URL et seule la requête est encodée et reconstruite en URL.
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)