Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

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) 

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