0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Nokogiriでタグの切り出しがうまくいかないとき名前空間の存在を忘れていませんか?

Last updated at Posted at 2020-01-21

HTMLやXMLのタグをスクレイビングするときに重宝するNokogiriライブラリは、かなり機能が充実していますが、精通するまで使用するのは難しいです。

ここでは、ライブラリ使用時にハマってしまったことを備忘録としてまとめました。
簡単な使い方が載っているサイトはすぐにたくさん見つかりましたが、後述するハマりポイントが記載されているサイトはなかなか見つかりませんでした。

Nokogiriの詳しい使い方は既に多くの人が分かりやすく説明してくれていますので、そちらを参照ください。

一応簡単におさらい

sample.rb
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をサンプルに説明します。

morning.xml
<head>
  <title>モーニング娘。</title>
  <team id='4期'>
     <status>石川</status>
     <status>吉澤</status>
     <status>加護</status>    
     <status></status>
  </team>
</head>
morning.rb
file = Nokogiri.XML(File.read(morning.xml))

タグの中身だけが欲しいんだ

morning.rb
file = Nokogiri.XML(File.read(morning.xml))
title = file.xpath('/head/title')
puts title
# > <title>モーニング娘。</title>

とすれば、titleタグが取得できますが、このままでは「"<title>モーニング娘。</title>"」と出力されてしまいます。中身の「モーニング娘。」だけが欲しい時は「.text.strip」を追加してあげましょう。

morning.rb
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タグが取得できます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?