4

適切なノードを見つけるためにクラスと要素階層にしか依存できないサイトをスクレイピングしようとしています。しかし、フォームの入力や送信などには使用できない return を使用しますMechanize::Page#searchNokogiri::XML::Element

純粋な CSS セレクターを使用したいのですが、クラスのマッチングは、さまざまな_with方法でも非常に簡単なようです。ただし、:not(.class)単純に CSS セレクターを使用する場合と比較して、要素の階層を一致させる方法がわかりません。

Nokogiri 要素を Mechanize オブジェクトに戻す方法、またはメソッドから直接取得するsearch方法はありますか?

4

1 に答える 1

7

この回答で述べたように、取得したorMechanize::Formを使用して新しいオブジェクトを簡単に作成できます。Nokogiri::XML::ElementMechanize::Page#searchMechanize::Page#at

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オブジェクトになります。


s を Mechanize 要素に変換するための中心的なユーティリティ関数はないようですNokogiri::XML::Elementが、必要な場所に変換が実装されています。したがって、CSS または XPath でドキュメントを検索し、該当する場合は Mechanize 要素を返すメソッドを作成するには、ノード タイプでかなり大きなスイッチ ケースが必要になります。正確には私が想像したものではありません。

于 2012-02-05T14:28:35.263 に答える