XPathでは、特定の条件に合致した親を持つ要素を抽出する事ができます。
たとえば、aタグを持つspanみたいな感じです。
実際のところ
List of time zones by country - Wikipedia, the free encyclopediaから、
国名とタイトルの関係だけ取りたいとします。
この際、以下のようにベースを置くわけですが……
base = doc.xpath("//table[1]//tr")
最初の要素指定の仕方が悪いのか、
base.xpath(".//td[1]")[-1].text # => "\n\n\n\nList of international rankings\nList of top international rankings by country\nLists by country\n\n\n\n"
となり目当てのテーブル以外が引っ括めて扱われてしまします。
この条件下では
目当てのテーブルにしか含まれていない要素……この場合、imgを含んだtdカラムだけを抽出する必要があります。
こういった場合、次に示すように「カッコ内に示す要素を持つ」という条件式を与えてあげれば、何とかなります。
name = base.xpath(".//td[../../../table/tr/td[.//img]][1]") tz = base.xpath(".//td[../../../table/tr/td[.//img]][3]") (0..name.size).each {|i| puts %Q(#{name[i].text} => #{tz[i].text} \n) } #>> France => UTC−10:00 — most of French Polynesia #>> ... #>> Zimbabwe => UTC+02:00 (CAT)
一応、狙い通りにはなりましたが、どうにも美しくない感じですね(白目