我是Ruby新手,正在使用Nokogiri來解析html網頁。錯誤在函數拋出當它到達線路:Nokogiri在函數中拋出異常但不在函數外
currentPage = Nokogiri::HTML(open(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')而不是一個變量。也許這是因爲你不瞭解變量範圍,但也不這樣做。變量是用snake_case命名的,而不是camelCase,所以'currentPage'應該是'current_page'。 –
不知道Ruby在變量名稱時區分大小寫。你有沒有robots.txt和限制代碼的資源?我沒有對這段代碼做任何瘋狂的事情,所以我不認爲我會用它來打擾任何人。 – JHam