2011-03-04 3 views
1

기계화 문서 사이트에서 예제를 하나 수행하고 있으며 nokogiri를 사용하여 결과를 구문 분석하려고합니다.Nokogiri 및 Mechanize 문제

doc = Nokogiri::HTML(search_results, 'UTF-8') 

다음과 같은 오류가 발생합니다 :

내 문제는 다음 줄이 오면 실행한다는 것입니다

나는 윈도우 비스타 시스템에 루비 1.9를 설치 한
C:/Ruby192/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4.1-x86-mingw32/lib/nokogiri/html/document.rb:71:in `parse': undefined method `name' for "UTF-8":String (NoMethodError) 
    from C:/Ruby192/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4.1-x86-mingw32/lib/nokogiri/html.rb:13:in `HTML' 
    from mechanize_test.rb:16:in `<main>' 

결과 기계로 반환 된 비 라틴어 (utf8)

대구 e 샘플은 다음과 같습니다.

# encoding: UTF-8 

require 'rubygems' 
require 'mechanize' 
require 'nokogiri' 

agent = Mechanize.new 
agent.user_agent_alias = 'Mac Safari' 
page = agent.get("http://www.google.com/") 
search_form = page.form_with(:name => "f") 
search_form.field_with(:name => "q").value = "invitations" 
search_results = agent.submit(search_form) 
puts search_results.body 

doc = Nokogiri::HTML(search_results, 'UTF-8') 

답변

2

이것은 Nokogiri가 호출되는 parse 메서드의 매개 변수로 기대하는 것과 관련이있는 것으로 나타났습니다. 내가 볼 수있는 첫 번째 문제는, 당신은 인코딩이 세 번째 매개 변수 아니다, 잘못된 매개 변수 슬롯에 인코딩 옵션에

인코딩을

Nokogiri.XML('<foo><bar /><foo>', nil, 'EUC-JP') 

공지 사항을 지정하는 parsing example 노코 기리에서 프로젝트 페이지를 전달하는 것입니다 두번째. 하지만 인코딩을 무시해야한다는 점에서 볼 때의 동작을 완전히 설명하지는 못합니다.

Nokogiri 설명서에서 Nokogiri :: HTML() 호출은 parse 메서드의 편리한 메서드입니다. :: HTML ::

def parse thing, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML, &block 
     document.parse(thing, url, encoding, options, &block) 
    end 
노코 기리 :: HTML :: 문서 구문 분석 방법에 대한 source

을 분석 노코 기리에 대한

코드는 조금 긴하지만, 여기 비록 관련 부분입니다 :

string_or_io.respond_to?(:encoding) 
    unless string_or_io.encoding.name == "ASCII-8BIT" 
     encoding ||= string_or_io.encoding.name 
    end 
end 
문자열 (NoMethodError) :

공지 사항 string_or_io.encoding.name, 이것은 "UTF-8"에 대한 오류 귀하의보고, 정의되지 않은 메서드의 이름을 '일치합니다.

귀하의 search_results 개체에 {: encoding => 'UTF-8'}의 키 값 쌍이있는 속성이 있습니까? Nokogiri는 이름 속성이 'UTF-8'인 객체를 저장할 인코딩을 찾고 있습니다. 이것으로 찾고에 대한

+1

고맙습니다. 나는 실수를했다는 것을 알았다. nokogiri에 대한 호출은 다음과 같아야합니다. doc = Nokogiri :: HTML (search_results.body, 'UTF-8'). search_results는 search_results.body와 다릅니다. Search_resuls에는 mechanicalize 인스턴스화에서 곧 나오는 정보가 들어 있습니다. search_resuls.body에는 nokogiri가 문제없이 구문 분석 할 수있는 HTML utf8 정보가 들어 있습니다. –

5

@Douglas Drouillard

고맙습니다. 나는 실수를했다는 것을 알았다. 노코 기리에 대한 호출은 있었어야 :

doc = Nokogiri::HTML(search_results.body, 'UTF-8') 

search_results 있다는 것은 search_results.body 것이 다르다.

Search_results이 정보를 잘 기계화 인스턴스화 나오는 포함 search_resuls.body는 HTML을 UTF8 노코 기리가 문제없이 구문 분석 할 수있는 정보를 포함하고있다.