Rubyを初めて使用しています.Nokogiriを使用してhtml Webページを解析しています。それはラインになったときにエラーが関数にスローされます。私は、関数の入力を検証したNokogiri関数内で例外をスローしますが、関数外ではありません
currentPage = Nokogiri::HTML(open(url))
、urlがwebaddressの文字列です。私が以前言及した行は、関数の外部で使用されたときに意図したとおりに動作しますが、内部では使用できません。関数内でその行に到達すると、次のエラーがスローされます。
WebCrawler.rb:25:in `explore': undefined method `[email protected]' for #<Nokogiri::HTML::Document:0x007f97ea0cdf30> (NoMethodError)
from WebCrawler.rb:43:in `<main>'
問題のある行が下に貼り付けられています。
def explore(url)
if CRAWLED_PAGES_COUNTER > CRAWLED_PAGES_LIMIT
return
end
CRAWLED_PAGES_COUNTER++
currentPage = Nokogiri::HTML(open(url))
links = currentPage.xpath('//@href').map(&:value)
eval_page(currentPage)
links.each do|link|
puts link
explore(link)
end
end
は、ここで(それははるかに長くはありません)完全なプログラムです:
require 'nokogiri'
require 'open-uri'
#Crawler Params
START_URL = "https://en.wikipedia.org"
CRAWLED_PAGES_COUNTER = 0
CRAWLED_PAGES_LIMIT = 5
#Crawler Functions
def explore(url)
if CRAWLED_PAGES_COUNTER > CRAWLED_PAGES_LIMIT
return
end
CRAWLED_PAGES_COUNTER++
currentPage = Nokogiri::HTML(open(url))
links = currentPage.xpath('//@href').map(&:value)
eval_page(currentPage)
links.each do|link|
puts link
explore(link)
end
end
def eval_page(page)
puts page.title
end
#Start Crawling
explore(START_URL)
まず、ドンウィキペディアをクロールしないでください。その代わりにAPIを使用してください。クローラを作成するときは、robots.txtファイルを使用して、それを尊重してください。また、コードを適切なネットワーク市民に絞り込むか、コードの禁止を準備することができます。 –
Rubyはポストインクリメントまたはデクリメント( 'CRAWLED_PAGES_COUNTER ++')をサポートしていません。 '+ = 1'を使う必要があります。また、変数の代わりに定数( 'CRAWLED_PAGES_COUNTER')を使用しています。おそらくそれはあなたが変数スコープを理解していないからですが、どちらもしません。変数はcamelCaseではなくsnake_caseを使って命名されるので、 'currentPage'は' current_page'でなければなりません。 –
Rubyが変数名になると大文字と小文字が区別されているのを知らなかった。 robots.txtとスロットルコードに関するリソースはありますか?私はこのコードで狂ったことを何もしていないので、私は誰もそれを気にしないと思っていませんでした。 – JHam