2012-02-04 12 views
4

私は正しいノードを見つけるためにクラスと要素の階層だけに依存できるサイトを削り取ろうとしています。しかしMechanize::Page#searchを使用するとNokogiri::XML::Elementが返ってきます。私はフォームなどを記入して送信することができません。Mechanize :: Pageの検索メソッドからMechanizeオブジェクトを取得するにはどうすればよいですか?

純粋なCSSセレクタを使用したいのですが、クラスのマッチングはさまざまな_withメソッドでも簡単です。しかし、:not(.class)のような一致するものはCSSセレクタを使用するのと比べてかなり冗長ですが、要素の階層をどのように一致させるかはわかりません。

Nokogiriの要素をMechanizeオブジェクトに変換する方法はありますか、それともsearchメソッドから直接取得する方が良いでしょうか?

+1

Mechanizeで特定できないフォームフィールドの例がありますか? –

+0

@mark該当するページのすべてのフォームとフォームフィールドには、IDと名前がランダムに生成されます。あなたがいつもsthを行うことができるので、あなたが特定できない要素はもちろんありません。 'page.forms [3]'のようなものです。しかし、 'page.search '.main-content form''でそのフォームを取得することは、より意味のあるIMHOであり、おそらくサイト上の何かが変わったときに壊れにくいでしょう。 – raphinesse

+0

私はあなたの回答を[この古い回答](http://stackoverflow.com/questions/2469117/nokogiri-error-undefined-method-radiobutton-with-why/6003166#comment11504418_6003166)で見つけることができると信じています。 – Phrogz

答えて

7

などはあなたが単にMechanize::Page#searchMechanize::Page#at経由で取得あなたのNokogiri::XML::Elementを使用して新しいMechanize::Formオブジェクト構築することができin this answer次のように述べています

a = Mechanize.new 
page = a.get 'https://stackoverflow.com/' 

# Get the search form via ID as a Nokogiri::XML::Element 
form = page.at '#search' 

# Convert it back to a Mechanize::Form object 
form = Mechanize::Form.new form, a, page 

# Use it! 
form.q = 'Foobar' 
result = form.submit 

注:あなたがあることをコンストラクタにMechanizeオブジェクトとMechanize::Pageオブジェクトを提供しなければならないがフォームを提出することができます。それ以外の場合は、コンテキストなしのMechanize::Formオブジェクトになります。


あり要素を機械化Nokogiri::XML::Element秒に変換するには、no中央効用関数でないように思われるのではなく、彼らが必要とされる場所の変換が実装されています。したがって、CSSやXPathで文書を検索し、適用可能な場合にはMechanize要素を返すメソッドを作成するには、ノードタイプでかなり大きなスイッチケースが必要です。正確に私が想像したものではありません。

+0

これを行い、フォームではなくページオブジェクトと同等のものを得る方法はありますか?試しましたMechanize :: Page.newそれは動作しませんでした... Mechの構文はNokogiriよりもはるかに簡単です – Carpela

+0

@KeiranBetteleyこれを詳しく教えてください。なぜ新しいページオブジェクトが必要なのか分かりません。 – raphinesse

+0

私がしたいことは、ウェブページのサブセットを取ることです。 page.search( "table.results")、次にそれにmechaniseメソッドを使用します。 結果= page.search( "table.results")。最初に 結果=結果.covert_to_mechanize_object links = results.links これ以上意味がありますか?元のヘッダー情報を使って偽のページを作成できるかどうかは疑問ですが、本体のDOMの特定のセクションだけです。 – Carpela

関連する問題