Je suis en train d'écrire un crawler en Ruby (1.9) qui consomme beaucoup de HTML à partir de nombreux sites aléatoires.
Lorsque j'essaie d'extraire des liens, j'ai décidé d'utiliser simplement .scan(/href="(.*?)"/i)
au lieu de nokogiri/hpricot (une importante accélération). Le problème est que je reçois maintenant beaucoup d'erreurs "séquence d'octets non valide en UTF-8
".
D'après ce que j'ai compris, la bibliothèque net/http
n'a pas d'options spécifiques d'encodage et les données reçues ne sont essentiellement pas correctement étiquetées.
Quelle serait la meilleure façon de travailler réellement avec ces données entrantes ? J'ai essayé .encode
avec les options de remplacement et d'invalidité définies, mais jusqu'à présent sans succès...
J'ai comparé avec ma solution et j'ai trouvé que la mienne perd quelques lettres, au moins : "Alena V.\"
. Alors que votre solution le garde : "Ale\u0308na V.\"
. Bien.
0 votes
Quelque chose qui pourrait casser les caractères, mais conserve la chaîne valide pour d'autres bibliothèques : valid_string = untrusted_string.unpack('C*').pack('U*')
0 votes
Ayant exactement le même problème, essayé les mêmes autres solutions. Pas d'amour. J'ai essayé celle de Marc, mais cela semble tout mélanger. Êtes-vous sûr que
'U*'
annule'C*'
?0 votes
Non, ça ne fait pas :) Je l'ai juste utilisé dans un webcrawler où je me soucie plus du fait que des bibliothèques tierces ne plantent pas que d'une phrase par-ci par-là.