3

Mechanize を使用して、ページの HTML でたとえば「email」などのフレーズを見つけて、その次のフレーズを見つけて、<input*その入力フィールドだけを入力することはできますか?

4

3 に答える 3

4

Mechanize は Nokogiri を内部的に使用して DOM 解析を処理します。これは、ページ内のさまざまな要素を見つける機能の基礎です。

解析された DOM にアクセスすることは可能であり、それを介して Nokogiri を使用して、Mechanize では通常見つけられない要素を見つけることができます。例えば:

require 'mechanize'

agent = Mechanize.new
page = agent.get('http://www.example.com')

# Use Nokogiri to find the content of the <h1> tag...
puts page.at('h1').content # => "Example Domain"

検索では、XPath アクセサーを使用して、「email」がページ内のどこにあるかを特定します。それが完了したら、次の<input>タグを見つけることができます。

単純な HTML フラグメントから始めて、これが Mechanize から来ているふりをします。

page = Nokogiri::HTML('<div><form><p>email</p><input name="email"></form></div>')
puts page.to_html

次のようになります。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div><form>
<p>email</p>
<input name="email">
</form></div></body></html>

「メール」の検索:

page.at("//*[contains(text(),'email')]")
#<Nokogiri::XML::Element:0x3ff50d0c4bc0 name="p" children=[#<Nokogiri::XML::Text:0x3ff50d0c497c "email">]>

それに基づいて、これは<input>タグを取得します:

input_tag = page.at("//*[contains(text(),'email')]/following-sibling::input")
#<Nokogiri::XML::Element:0x3ff50d09b75c name="input" attributes=[#<Nokogiri::XML::Attr:0x3ff50d09b5f4 name="name" value="email">]>

入力タグが見つかったら、Nokogiri を使用してタグから「名前」を取得し、その特定の入力フィールドを見つけて入力するように Mechanize に指示します。

input_tag['name']
=> "email"

Web フォームが正しく機能するには、要素に名前を付ける必要があります。これらは、フォームが送信されるときにサーバーに渡されます。名前がないと、どの入力が特定のデータを送信したかを判断するのに多くの作業が必要になります。プログラマーは怠け者なので、一生懸命働きたくないので、作業する名前があることを期待できます。

詳細については、「Ruby Mechanize、Nokogiri、および Net::HTTP」を参照してください。また、Stack Overflow を検索してください。Nokogiriのドキュメントとチュートリアルを読むと、残りの方法を理解するために必要な多くの情報が得られます。

于 2013-03-29T05:16:25.857 に答える
2

最初に、句 text を含む要素を見つけます。

el = page.at('*[text()*="some phrase"]')

そこから、次の最初の入力を取得できます。

input = el.at('./following::input')

次に、その入力の祖先フォーム ノードを見つけます。

form_node = input.ancestors('form')[0]

次に、それを使用して Mechanize::Form オブジェクトを取得します

form = page.form_with(:form_node => form_node)

そして今、あなたは値を記入することができます

form[input[:name]] = 'foo'
于 2013-03-29T08:22:35.960 に答える
1

整形式のHTMLページの場合、input要素には がlabel何のためにあるのかを示すが必要inputです。この場合、すべてを反復してlabel、 text を含むものを見つけ、の属性によって"email"関連付けinputられたを取得できます。forlabel

ただし、すべての HTML ページが整形式であるとは限りません。いいえlabelfor属性がない、またはその他の不正な問題。

inputDOM のある要素の直後を意味する場合。"email"DOM トラバーサルを実行して、要素を含むinput要素の隣に要素があるかどうかを確認できます。

inputレンダリングされたページの次の要素を意味する場合は、 「次の」要素を定義する必要があります。そして、たいへんな努力なしには、望むものを手に入れることはできないと思います。要素「email」の後にある要素は、何らかの CSS トリックを使用してその前に配置される場合があります。それを見つけるには、グラフィカル API が必要ですinputwatirただし、の API ドキュメントには記載されていません。

于 2013-03-29T04:24:57.813 に答える