Ich las HTML mit Open-Uri, analysierte es mit Nokogiri und kratzte es, aber zu dieser Zeit war es möglich, zu analysieren, ohne verstümmelte Zeichen zu verursachen, selbst wenn ich die Codierung von Nokogiri auf "Null" änderte (oder wegließ). Es war. Beim Lesen von HTML mit open-uri wird es in Binärform gelesen, daher habe ich mich darauf konzentriert, was passiert, wenn in Binärdatei gelesenes HTML mit Nokogiri mit der Codierung "nil" analysiert wird.
Stellen wir die Codierung ein, wenn wir HTML mit Nokogiri als "Null" analysieren. Setzen Sie nil
auf das dritte Argument von HTML.parse.
Das folgende HTML wird dieses Mal geladen. Die Datei ist in Shift_JIS geschrieben.
hello.html
<html>
<head>
<title>Hallo</title>
<meta charset="Shift_JIS">
</head>
<body>
</body>
</html>
Laden Sie HTML im Binärmodus. Sie können die Datei binär lesen, indem Sie der offenen Methode die Option "rb" hinzufügen. Lassen Sie uns zur Überprüfung den Zeichencode zum Zeitpunkt des Lesens im Binärmodus und den Zeichencode nach dem Parsen mit Nokogiri anzeigen.
sample.rb
require 'nokogiri'
html = open('hello.html', 'rb').read
p html.encoding
p Nokogiri::HTML.parse(html, nil, nil).encoding
Ausführungsergebnis
sample.rb Ergebnis
$ ruby sample.rb
#<Encoding:ASCII-8BIT>
"Shift_JIS"
Aus dem Ergebnis kann bestätigt werden, dass die Codierung des gelesenen HTML selbst ASCII-8BIT ist, die Codierung nach dem Parsen durch Nokogiri jedoch Shift_JIS ist, was der Originaldatei entspricht. Übrigens, auch wenn Sie das Argument als "HTML.parse (html)" weglassen, können Sie das gleiche Ergebnis wie oben erhalten.
Mit Blick auf die obigen Überprüfungsergebnisse verweist Nokogiri selbst auf einen Zeichencode. Wo beziehen Sie sich?
Eigentlich werde ich auf das Meta-Element der ursprünglichen HTML-Datei verweisen. Es bezieht sich auf den Zeichensatz von "".
Versuchen Sie, den Zeichensatzteil auf UTF-8 zu ändern, und geben Sie den Zeichencode auf die gleiche Weise wie zuvor aus.
hello.html
<html>
<head>
<title>Hallo</title>
<meta charset="UTF-8">
</head>
<body>
</body>
</html>
Ausführungsergebnis
sample.rb Ergebnis
$ ruby sample.rb
#<Encoding:ASCII-8BIT>
"UTF-8"
Sie können sehen, dass der Zeichencode nach dem Parsen in UTF-8 geändert wurde.
Übrigens, wenn ich versuche, Zeichensätze zu eliminieren, ...
hello.html
<html>
<head>
<title>Hallo</title>
<meta>
</head>
<body>
</body>
</html>
sample.rb Ergebnis
$ ruby sample.rb
#<Encoding:ASCII-8BIT>
nil
Der Zeichencode nach dem Parsen ist gleich Null geworden. Wenn Sie den Titel usw. in diesem Zustand anzeigen, werden die Zeichen natürlich verstümmelt.
Recommended Posts