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
.
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.
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.
nil
, Nokogiri se référera au code de caractère par lui-même.
--Nokogiri fait référence au jeu de caractères de l'élément meta du html lu en binaire.
--Si le jeu de caractères n'est pas écrit, le codage de Nokogiri sera nil
Recommended Posts