Nokogiri(というか XPath ?)のHTMLパースで属性値を指定した際にオブジェクトが取得できないとき

結論

属性値(プロパティ値)はすべて小文字で記述しないといけない

以下のようなソース(の一部)があったとします。

<table width="100%" border="1">
  <tbody>
    <tr class="FooBar">
      <td width="100%">内容1</td>
    </tr>
    <tr class="FooBar">
      <td width="100%">内容2</td>
    </tr>
    <tr class="FooBar">
      <td width="100%">内容3</td>
    </tr>

このとき、Nokogiri を用いるために以下のように書いたとします。@docは、上記のHTMLをパースするためのNokogiriのオブジェクトです。

nodesets = @doc.xpath("//tr[@class='FooBar']")
puts nodesets.count

これを実行したときの表示結果は、0です。つまり、見つけられていないです。

FooBarを小文字に書き直し、以下のようにコードを書き直します。

nodesets = @doc.xpath("//tr[@class='foobar']")
puts nodesets.count

今度はちゃんと3が表示されました。

ハマりからの脱出

また大ハマり事案かと思いましたが、今回はそれほどではありませんでした。一段上のタグであるtbodyの内容を取得し表示させることで、当該属性値が小文字でなければいけないのでは、と気づけたからです。

公式ドキュメントを読む、明確な意図を持って手を動かして実験する、エラーコードを一字一句読む*1、これらの鉄則を忘れないようにしたいです。

*1:今回は関係ありませんでしたが

Powered by はてなブログ