Il existe une bibliothèque Python appelée chardet. Si vous entrez la chaîne d'octets, vous pouvez déduire le code de caractère dans lequel la chaîne d'octets a été écrite.
Je voulais utiliser chardet avec Python3, mais l'officiel n'est pas encore compatible avec Python3.
Quand je l'ai cherché, j'ai trouvé une bibliothèque appelée python3-chardet qui a fourchu chardet, j'ai donc décidé de l'utiliser.
Téléchargez et installez à partir de github.
$ git clone [email protected]:bsidhom/python3-chardet.git
Dans le répertoire créé dans
$ python setup.py install
Ensuite, l'installation est terminée.
ipython3
import chardet
chardet.detect('abc'.encode('utf-8'))
> {'confidence': 1.0, 'encoding': 'ascii'}
chardet.detect('AIUEO'.encode('utf-8'))
> {'confidence': 0.9690625, 'encoding': 'utf-8'}
chardet.detect('AIUEO'.encode('Shift-JIS'))
> {'confidence': 0.5, 'encoding': 'windows-1252'}
Cela a fonctionné correctement. Je suis un peu inquiet que'aiueo '.encode (' Shift-JIS ') ait été jugé être windows-1252, mais comme la confiance est de 0,5, la confiance de Chardet peut être à moitié sûre. La phrase était trop courte, donc ça ne peut pas être aidé.
Nous avons mené d'autres expériences pour voir s'il pouvait être utilisé lors de la création de scripts de pages Web.
Le site Web cible est décidé à être price.com http://kakaku.com/. C'est juste parce qu'il utilise Shift_JIS.
ipython3
import chardet
import requests
r = requests.get('http://kakaku.com')
chardet.detect(r.content)
> {'confidence': 0.99, 'encoding': 'SHIFT_JIS'}
Il a pris une bonne décision. Contrairement à l'exemple de'aiueo'.encode ('Shift-JIS'), il a correctement jugé SHIFT_JIS au lieu de windows-1252 car il ciblait une longue colonne d'octets pour toute la page Web. Sembler. La confiance a également augmenté.
J'ai remarqué plus tard qu'il y avait une bibliothèque Python d'extension C appelée cChardet. Peut être utilisé avec Python3. Py Yoshi est incroyable.
Puisqu'il est dans pypi, vous pouvez l'obtenir sur https://pypi.python.org/pypi/cchardet/ pip.
$ pip install cchardet
Comme c'est un gros problème, j'ai utilisé la première page de Price.com pour comparer les vitesses. Le code est comme suit.
compare.py
import chardet
import cchardet
import requests
import time
if __name__ == '__main__':
r = requests.get('http://kakaku.com')
begin_time = time.clock()
guessed_encoding = chardet.detect(r.content)
end_time = time.clock()
print('chardet: %f, %s' % (end_time - begin_time, guessed_encoding))
begin_time_of_cc = time.clock()
guessed_encoding_by_cc = cchardet.detect(r.content)
end_time_of_cc = time.clock()
print('cChardet: %f, %s' % (end_time_of_cc - begin_time_of_cc, guessed_encoding_by_cc))
Et le résultat est le suivant.
chardet: 1.440141, {'confidence': 0.99, 'encoding': 'SHIFT_JIS'}
cChardet: 0.000589, {'confidence': 0.9900000095367432, 'encoding': 'SHIFT_JIS'}
N'est-ce pas accablant?
Utilisez cChardet! !! !!
Recommended Posts