我是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