web-dev-qa-db-ja.com

NokogiriでXPathを使用するにはどうすればよいですか?

そのためのドキュメントやチュートリアルは見つかりませんでした。そのようなものはありますか?


doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr')

上記のコードは、table子が属性tbodyが「threadbits_forum_251」と等しい場所にあるidをどこでも取得します。しかし、なぜ二重//で始まるのですか?最後に/trがあるのはなぜですか?詳細については、「 Ruby Nokogiri解析HTMLテーブルII 」を参照してください。


Nokogiriを使用してhrefidaltsrcなどを抽出する方法を誰かに教えてもらえますか?

td[3]/div[1]/a/text()' <--- extracts text

どうすれば他のものを抽出できますか?

25
Radek

XPathチュートリアル を読む必要があるようです

_//table/tbody[@id="threadbits_forum_251"]/tr_式の意味は次のとおりです。

  • _//_-XMLドキュメントの任意の場所
  • _table/tbody_-tbodyの子を持つテーブル要素を取得します
  • _[@id="threadbits_forum_251"]_-whereid属性は「threadbits_forum_251」に等しい
  • tr-tr要素を取ります

したがって、基本的には、次のことを知っておく必要があります。

  • 属性は_@_で始まる
  • 条件は_[]_括弧内に入る

私がそのAPIを正しく理解している場合は、doc.xpath("td[3]/div[1]/a")["href"]、または_td[3]/div[1]/a/@href_要素が1つしかない場合は_<a>_を使用できます。

46
Rubens Farias

あなたのXPathは正しいです、そしてあなたはあなた自身の質問の最初の部分に(ほとんど)答えましたようです:

doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr')

「上のコードは私に何かを与えます テーブル テーブルのtr、anywhere、これは属性idがtbitbits_forum_251と等しいtbodyの子を持つ


//は、次の要素がドキュメントのどこにでも出現できることを意味します。

最後の/trは、一致する要素のtrノードを取得することを意味します。

各属性を1つずつ抽出する必要はありません。 Nokogiriで4つすべての属性を含むノード全体を取得し、以下を使用して属性を取得します。

theNode['href']
theNode['src']

ここで、theNodeはNokogiri Node オブジェクトです。


編集:

申し訳ありませんが、これらのライブラリは使用していませんが、XPathの評価と解析はMechanizeによって行われていると思います。したがって、要素全体とその属性を一度に取得する方法は次のとおりです。

doc.xpath("td[3]/div[1]/a").each do |anchor|
    puts anchor['href']
    puts anchor['src']
    ...
end
7
Anurag