HTMLやXMLのタグをスクレイビングするときに重宝するNokogiriライブラリは、かなり機能が充実していますが、精通するまで使用するのは難しいです。
ここでは、ライブラリ使用時にハマってしまったことを備忘録としてまとめました。
簡単な使い方が載っているサイトはすぐにたくさん見つかりましたが、後述するハマりポイントが記載されているサイトはなかなか見つかりませんでした。
Nokogiriの詳しい使い方は既に多くの人が分かりやすく説明してくれていますので、そちらを参照ください。
一応簡単におさらい
require 'nokogiri'
#①XMLファイルを読み込む
file = Nokogiri::XML(File.read('sample.xml'))
#②XMLクラスを作成して、変数に格納する
a = Nokogiri::XML::Builder.new(encoding: 'utf-8') do |xml|
#要素の作成
end
②の「要素の作成」については、以下のリンク先を参照すれば詳しく載っています。
https://www.rubydoc.info/gems/nokogiri/Nokogiri/XML/Builder
はまりポイント
以下のXMLをサンプルに説明します。
<head>
<title>モーニング娘。</title>
<team id='4期'>
<status>石川</status>
<status>吉澤</status>
<status>加護</status>
<status>辻</status>
</team>
</head>
file = Nokogiri.XML(File.read(morning.xml))
タグの中身だけが欲しいんだ
file = Nokogiri.XML(File.read(morning.xml))
title = file.xpath('/head/title')
puts title
# > <title>モーニング娘。</title>
とすれば、titleタグが取得できますが、このままでは「"<title>モーニング娘。</title>"」と出力されてしまいます。中身の「モーニング娘。」だけが欲しい時は「.text.strip」を追加してあげましょう。
file = Nokogiri.XML(File.read('morning.xml'))
title = file.xpath('/head/title').text.strip
puts title
# > モーニング娘。
名前空間の存在を忘れていたら要素を取り出せない
Nokogiriで要素を切り出すためにxpathを使えばいいのですが、ここで
a = file.xpath('/head/title')
とすれば、titleタグを切り出せますが、
a = file.xpath('/head/team')
とすると、うまくいきません。
もし名前空間を無視して使用したい場合は
file = Nokogiri::XML(File.read('morning.xml'))
file.remove_namespaces!
と、名前空間を削除しましょう。すると、
a = file.xpath('/head/team')
が動いて、teamタグが取得できます。