Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

XPathで特定の条件に合致した親を持つ要素を抽出する

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) 

一応、狙い通りにはなりましたが、どうにも美しくない感じですね(白目