저는 Ruby를 처음 사용하고 있으며, Nokogiri를 사용하여 html 웹 페이지를 구문 분석하고 있습니다. 이 선에 도달 할 때 오류가 함수에서 발생합니다 : 나는 함수의 입력을 확인했습니다Nokogiri 함수에서 예외를 throw하지만 함수 외부에 있지 않습니다.
currentPage = Nokogiri::HTML(open(url))
, URL은 webaddress있는 문자열입니다. 앞에서 언급 한 선은 함수 외부에서 사용될 때는 의도 한대로 작동하지만 내부에서는 사용되지 않습니다. 함수 내에서 해당 줄을 가져 오면 다음 오류가 throw됩니다.
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