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 nilRecommended Posts