6

私は機械化に苦労しています。位置(div#content内のすべてのリンク)またはhrefによってのみ識別できるリンクのセットを「クリック」したいと思います。

上記の両方の識別方法を試しましたが、成功しませんでした。

ドキュメントから、リンク上の直接の属性ではなく、DOM内の位置に基づいて、リンクのコレクション(クリック用)を返す方法を理解できませんでした。

次に、ドキュメントでは、 :hrefを使用して部分的なhrefと一致させることができると提案されています。

page = agent.get('http://foo.com/').links_with(:href => "/something")

ただし、リンクを返すための唯一の方法は、完全修飾URLを渡すことです。

page = agent.get('http://foo.com/').links_with(:href => "http://foo.com/something/a")

これは、hrefのリンクのコレクションを返したい場合にはあまり役に立ちません。

http://foo.com/something/a
http://foo.com/something/b
http://foo.com/something/c
etc...

私は何か間違ったことをしていますか?非現実的な期待はありますか?

4

3 に答える 3

9

パート II :href に渡す値は、デフォルトで正確に一致する必要があります。したがって、例の href は一致するだけで一致<a href="/something"></a>しません<a href="foo.com/something/a"></a>

やりたいことは、href フィールド内の部分文字列と一致するように正規表現を渡すことです。そのようです:

page = agent.get('http://foo.com/').links_with(:href => %r{/something/})

編集: パート I リンク内のリンクのみを選択するようにするには、nokogiri スタイルの検索メソッドを文字列に追加します。このような:

page = agent.get('http://foo.com/').search("div#content").links_with(:href => %r{/something/})    # **

OK、それは機能しません。なぜならpage = agent.get('http://foo.com/').search("div#content")、機械化オブジェクトの代わりに Nokogiri オブジェクトが返されるため、links_with が機能しないからです。ただし、css メソッドを使用して Nokogiri オブジェクトからリンクを抽出することはできます。私は次のようなものを提案します:

page = agent.get('http://foo.com/').search("div#content").css("a")

それでもうまくいかない場合は、http://nokogiri.org/tutorialsを確認することをお勧めします。

于 2012-05-08T14:18:26.620 に答える
2

n 番目のリンク:

page.links[n-1]

最初の 5 つのリンク:

page.links[0..4]

href に「何か」が含まれるリンク:

page.links_with :href => /something/
于 2012-05-09T01:34:55.443 に答える
1

ノコギリノードを使用して機械化リンクを取得できます。links() メソッドのソース コードを参照してください。

# File lib/mechanize/page.rb, line 352
def links
  @links ||= %w{ a area }.map do |tag|
    search(tag).map do |node|
      Link.new(node, @mech, self)
    end
  end.flatten
end

つまり、次のことを意味します。

the_links= page.search("valid_selector").map do |node|
  Mechanize::Page::Link.new(node, agent, page)
end

これにより、便利な href、text、および uri メソッドが提供されます。

于 2013-04-05T08:57:28.893 に答える