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またはXPathアクセサーに一致する最初のノードを返しますcss_at
。xpath_at
これらすべてのメソッドで、...xpath
バリアントはXPathを受け入れ、バリアント...css
はCSSアクセサーを使用します。
ノードを作成したら、通常、パラメーターを抽出するか、そのテキスト/コンテンツを取得するという2つのことのいずれかを実行する必要があります。を使用して属性を簡単に取得し、を使用[attribute_to_get]
してテキストを取得できますtext
。
これらのメソッドを使用すると、ページ内のすべてのリンクを検索し、次のようなものを使用して、テキストと関連するhrefを返すことができます。
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"
]
]