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/})

编辑: 第一部分为了让它只在链接中选择链接,在你的字符串中添加一个 nokogiri 风格的搜索方法。像这样:

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

好的,这不起作用,因为在您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

您可以使用 nokogiri 节点获得机械化链接。请参阅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 回答