Je suis nouveau à Ruby et j'utilise Nokogiri pour analyser les pages Web html. Une erreur est renvoyée dans une fonction quand il arrive à la ligne:Nokogiri Lancer exception dans la fonction mais pas en dehors de la fonction
currentPage = Nokogiri::HTML(open(url))
J'ai vérifié les entrées de la fonction, url est une chaîne avec un webaddress. La ligne que je mentionne précédemment fonctionne exactement comme prévu lorsqu'elle est utilisée en dehors de la fonction, mais pas à l'intérieur. Quand il arrive à cette ligne dans la fonction, l'erreur suivante est générée:
WebCrawler.rb:25:in `explore': undefined method `[email protected]' for #<Nokogiri::HTML::Document:0x007f97ea0cdf30> (NoMethodError)
from WebCrawler.rb:43:in `<main>'
La fonction la ligne problématique est en est collé ci-dessous.
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
Voici le programme complet (Il n'y a pas beaucoup plus):
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)
D'abord, don 't explorer Wikipedia, juste ne pas. Utilisez leur API à la place. Lorsque vous écrivez un robot d'exploration, apprenez à utiliser le fichier robots.txt et à l'honorer. Aussi, limitez votre code pour être un bon citoyen du réseau ou soyez prêt à faire bannir votre code. –
Ruby ne prend pas en charge la post-incrémentation ou la décrémentation ('CRAWLED_PAGES_COUNTER ++'). Vous devez utiliser '+ = 1'. En outre, vous utilisez des constantes ('CRAWLED_PAGES_COUNTER') au lieu d'une variable. Peut-être que c'est parce que vous ne comprenez pas la portée variable, mais ne le faites pas non plus. Les variables sont nommées en utilisant snake_case, pas camelCase donc 'currentPage' devrait être' current_page'. –
Ne savait pas Ruby était sensible à la casse lorsqu'il s'agissait de noms de variables. Avez-vous des ressources sur le fichier robots.txt et le code de limitation? Je ne fais rien de fou avec ce code, donc je ne pensais pas que je dérangerais quiconque avec ça. – JHam