Mechanize を使用して、ページの HTML でたとえば「email」などのフレーズを見つけて、その次のフレーズを見つけて、<input*
その入力フィールドだけを入力することはできますか?
3 に答える
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のドキュメントとチュートリアルを読むと、残りの方法を理解するために必要な多くの情報が得られます。
最初に、句 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'
整形式のHTMLページの場合、input
要素には がlabel
何のためにあるのかを示すが必要input
です。この場合、すべてを反復してlabel
、 text を含むものを見つけ、の属性によって"email"
関連付けinput
られたを取得できます。for
label
ただし、すべての HTML ページが整形式であるとは限りません。いいえlabel
、for
属性がない、またはその他の不正な問題。
input
DOM のある要素の直後を意味する場合。"email"
DOM トラバーサルを実行して、要素を含むinput
要素の隣に要素があるかどうかを確認できます。
input
レンダリングされたページの次の要素を意味する場合は、 「次の」要素を定義する必要があります。そして、たいへんな努力なしには、望むものを手に入れることはできないと思います。要素「email」の後にある要素は、何らかの CSS トリックを使用してその前に配置される場合があります。それを見つけるには、グラフィカル API が必要ですinput
。watir
ただし、の API ドキュメントには記載されていません。