Nokogiriまたは任意のXML/HTMLパーサーを使用して要素または要素のグループを見つけるのに最も大きなトリックは、短いアクセサーから始めて、探しているものの一般的な近傍に入り、あなたが望むものがあるまで、あなたが行くように微調整してください。
第2の秘訣は、ドキュメントのルートから始めることを絶対に確かめない限り、//
を使用してXPathを起動することを覚えておいてください。/
ではありません。 //
は、Linuxのコマンドラインで'**/*'
ワイルドカードと似ています。どこでも検索します。
また、ブラウザから提供されているXPathまたはCSSアクセサを信頼しないでください。あなたは見たように、彼らはtbody
を含むHTMLソースにあらゆる種類の修正を行います。代わりに、RubyのOpenURIまたはcurl
またはwget
を使用して、元のソースを取得し、vi
またはvim
のようなエディタで表示するか、less
またはcat
を画面に使用してください。このようにファイルを変更する機会はありません。
最後に、検索をXPathでチャンクに分割してから、Rubyが繰り返し実行するようにするのは、複雑でXPathを維持するのが難しく、壊れやすいからです。
ノコギリ自体はかなり簡単です。あなたがしたいことの大部分は、2つの異なる方法の簡単な組み合わせです:search
とat
です。どちらもCSSまたはXPathセレクタを使用します。 search
は、兄弟メソッドxpath
とcss
とともに、NodeSet
を返します。これは、基本的に反復処理できるノードの配列です。 at
,css_at
およびxpath_at
は、CSSまたはXPathアクセサに一致する最初のノードを返します。これらのすべてのメソッドでは、...xpath
バリアントはXPathを受け入れ、...css
はCSSアクセサーを受け取ります。
ノードを作成したら、一般的にはパラメータを抽出するか、テキスト/コンテンツを取得するかのいずれかを行います。 [attribute_to_get]
と、text
を使用して簡単に属性を取得できます。出力
require 'awesome_print'
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::HTML(open('http://www.example.com'))
ap doc.search('a').map{ |a| [a['href'], a.text] }[0, 5]
:
[
[0] [
[0] "/",
[1] ""
],
[1] [
[0] "/domains/",
[1] "Domains"
],
[2] [
[0] "/numbers/",
[1] "Numbers"
],
[3] [
[0] "/protocols/",
[1] "Protocols"
],
[4] [
[0] "/about/",
[1] "About IANA"
]
]
Nokogiriについての素晴らしい点の1つは、CSSアクセサーもサポートしていることです。ときどきCSSが見つかるより速いパスです。時にはXPathがあります。必要に応じて自由に交換してください。 –
ええ、私は両方のCSSセレクタとXPathを使用します。両方を併用すると、実際にはより強力になります。 –