Ruby: Nokogiri identifie automatiquement le code de caractère du html lu en mode binaire

introduction

J'ai lu du html avec open-uri, je l'ai analysé avec Nokogiri et je l'ai gratté, mais à ce moment-là, même si j'avais changé l'encodage de Nokogiri en nil (ou omis), il était possible d'analyser sans provoquer de caractères déformés. C'était. Lors de la lecture du html avec open-uri, il est lu en binaire, donc je me suis concentré sur ce qui se passe lorsque le html lu en binaire est analysé avec Nokogiri avec le codage nil.

Essayez de définir le codage HTML.parse sur "nil"

Définissons l'encodage lors de l'analyse html avec Nokogiri comme nil. Définissez nil sur le troisième argument de HTML.parse. Le code HTML suivant est chargé cette fois. Le fichier est écrit en Shift_JIS.

hello.html


<html>
  <head>
    <title>Bonjour</title>
    <meta charset="Shift_JIS">
  </head>
  <body>
  </body>
</html>

Chargez html en mode binaire. Vous pouvez lire le fichier en binaire en ajoutant l'option `` rb '' à la méthode open. Pour vérification, affichons le code du caractère au moment de la lecture en mode binaire et le code du caractère après analyse avec Nokogiri.

sample.rb


require 'nokogiri'

html = open('hello.html', 'rb').read

p html.encoding
p Nokogiri::HTML.parse(html, nil, nil).encoding

Résultat d'exécution

sample.résultat rb


$ ruby sample.rb
#<Encoding:ASCII-8BIT>
"Shift_JIS"

À partir du résultat, il peut être confirmé que le codage du code HTML lu lui-même est ASCII-8BIT, mais le codage après analyse par Nokogiri est Shift_JIS, qui est le même que le fichier d'origine. Au fait, même si vous omettez l'argument comme HTML.parse (html), vous pouvez obtenir le même résultat que ci-dessus.

Où Nokogiri fait-il référence au code de caractère

En regardant les résultats de vérification ci-dessus, Nokogiri va se référer à un code de caractère par lui-même. De quoi parlez-vous?

En fait, je vais faire référence à l'élément meta du fichier html d'origine. Il fait référence au jeu de caractères de <meta charset =" Shift_JIS ">.

Essayez de changer la partie charset en UTF-8 et sortez le code de caractère de la même manière qu'auparavant.

hello.html


<html>
  <head>
    <title>Bonjour</title>
    <meta charset="UTF-8">
  </head>
  <body>
  </body>
</html>

Résultat d'exécution

sample.résultat rb


$ ruby sample.rb
#<Encoding:ASCII-8BIT>
"UTF-8"

Vous pouvez voir que le code de caractère après l'analyse a changé en UTF-8.

Au fait, quand j'essaye d'éliminer le jeu de caractères, ...

hello.html


<html>
  <head>
    <title>Bonjour</title>
    <meta>
  </head>
  <body>
  </body>
</html>

sample.résultat rb


$ ruby sample.rb
#<Encoding:ASCII-8BIT>
nil

Le code de caractère après analyse est devenu nul. Bien sûr, si vous affichez le titre, etc. dans cet état, les caractères seront déformés.

Résumé

Recommended Posts

Ruby: Nokogiri identifie automatiquement le code de caractère du html lu en mode binaire
Corrigez le code de caractère en Java et lisez à partir de l'URL
Devinez le code de caractère en Java
L'application absorbe la différence de code de caractère
[Supprimer la première lettre de la chaîne de caractères] Ruby
Implémentez l'algorithme dans Ruby: Day 3-Dichotomy-
[Ruby] Code pour afficher le jour
[Ruby] Le rôle des indices dans l'apprentissage des éléments dans les tableaux
Ruby, Nokogiri: récupère le nom de l'élément du nœud sélectionné
Obtenez l'URL de la destination de la redirection HTTP dans Ruby
[Ruby on Rails] Saisissez automatiquement une adresse à partir d'un code postal
Spécifiez le code de caractère de la source lors de la construction avec Maven