0

Mechanize を使用してフォームに入力し、リンクのリストを取得することができました。結果の一部は次のようになります。

[
  #<Mechanize::Page::Link "View" "/cgi-bin/dcdev/forms/C00508200/800329/">,
  #<Mechanize::Page::Link "View" "/cgi-bin/dcdev/forms/C00487363/800634/">,
  #<Mechanize::Page::Link "View" "/cgi-bin/dcdev/forms/C00498097/800463/">
] 

私は次のことを理解することができませんでした。

  1. スクレイピングする必要があるページは、これらのリンクではなく/sa/ALL、リンクの最後にあるページです/cgi-bin/dcdev/forms/C00508200/800329/sa/ALLsa/ALL各リンクの末尾に追加するにはどうすればよいですか?
  2. 次に、修正された各リンクをクリックして、結果のページを保存するにはどうすればよいですか? ループ?
4

2 に答える 2

1

こうやって釣る…

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<html>
  <body>
    <a href="/cgi-bin/dcdev/forms/C00508200/800329/">
    <a href="/cgi-bin/dcdev/forms/C00487363/800634/">
    <a href="/cgi-bin/dcdev/forms/C00498097/800463/">
  </body>
</html>
EOT

hrefs = doc.search('a').map{ |a| a['href'] + '/sa/ALL' }

Mechanize は、HTML パーサーとして Nokogiri を内部的に使用しています。doc次のような方法で Mechanizeの使用にアクセスできます。

require 'mechanize'

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

ノコギリ文書を扱っている証拠:

page.parser.class # => Nokogiri::HTML::Document < Nokogiri::XML::Document

操作のためにページ内のリンクを取得します。

page.parser.search('a').map(&:to_html)

どちらが返されますか:

[
    [ 0] "<a href=\"/\"><img src=\"/_img/iana-logo-pageheader.png\" alt=\"Homepage\"></a>",
    [ 1] "<a href=\"/domains/\">Domains</a>",
    [ 2] "<a href=\"/numbers/\">Numbers</a>",
    [ 3] "<a href=\"/protocols/\">Protocols</a>",
    [ 4] "<a href=\"/about/\">About IANA</a>",
    [ 5] "<a href=\"/go/rfc2606\">RFC 2606</a>",
    [ 6] "<a href=\"/about/\">About</a>",
    [ 7] "<a href=\"/about/presentations/\">Presentations</a>",
    [ 8] "<a href=\"/about/performance/\">Performance</a>",
    [ 9] "<a href=\"/reports/\">Reports</a>",
    [10] "<a href=\"/domains/\">Domains</a>",
    [11] "<a href=\"/domains/root/\">Root Zone</a>",
    [12] "<a href=\"/domains/int/\">.INT</a>",
    [13] "<a href=\"/domains/arpa/\">.ARPA</a>",
    [14] "<a href=\"/domains/idn-tables/\">IDN Repository</a>",
    [15] "<a href=\"/protocols/\">Protocols</a>",
    [16] "<a href=\"/numbers/\">Number Resources</a>",
    [17] "<a href=\"/abuse/\">Abuse Information</a>",
    [18] "<a href=\"http://www.icann.org/\">Internet Corporation for Assigned Names and Numbers</a>",
    [19] "<a href=\"mailto:iana@iana.org?subject=General%20website%20feedback\">iana@iana.org</a>"
]

それらをつかんで変更する:

links = page.parser.search('a').map{ |a| a['href'] + 'sa/ALL' }
[
    [ 0] "/sa/ALL",
    [ 1] "/domains/sa/ALL",
    [ 2] "/numbers/sa/ALL",
    [ 3] "/protocols/sa/ALL",
    [ 4] "/about/sa/ALL",
    [ 5] "/go/rfc2606sa/ALL",
    [ 6] "/about/sa/ALL",
    [ 7] "/about/presentations/sa/ALL",
    [ 8] "/about/performance/sa/ALL",
    [ 9] "/reports/sa/ALL",
    [10] "/domains/sa/ALL",
    [11] "/domains/root/sa/ALL",
    [12] "/domains/int/sa/ALL",
    [13] "/domains/arpa/sa/ALL",
    [14] "/domains/idn-tables/sa/ALL",
    [15] "/protocols/sa/ALL",
    [16] "/numbers/sa/ALL",
    [17] "/abuse/sa/ALL",
    [18] "http://www.icann.org/sa/ALL",
    [19] "mailto:iana@iana.org?subject=General%20website%20feedbacksa/ALL"
]

どのリンクに変更を適用するかを決定するのはあなたであり、それらを再取得する方法はあなたの課題です。

于 2012-08-23T19:37:23.227 に答える
0
page.links.each do |link|
  agent.get(link.href + 'sa/ALL').save
end
于 2012-08-23T23:32:02.677 に答える