2016-10-20 3 views
-1

테이블에서 데이터를 긁어 내려고했는데 수집 한 데이터를 반복 할 수없는 이유를 알 수 없습니다. .루프에서 children.text를 호출 할 때 NoMethodError가 발생하지만 루프 외부에서 작동합니다.

테이블의 각 노드를 반복하면서 텍스트를 가져오고 싶지만 문은 내 루프 외부에 쓰여진 경우에만 작동합니다.

Take a look at the terminal I'm getting

는 루프의 puts 외부에서 잘 작동 것이 분명하지만, 같은 라인은 루프에 실패합니다. 내가

puts entry.children[1] 

를 사용하는 경우 나는 루프에서 적절한 응답을 얻을 수 있지만, children.text를 추가하면 실패의 원인이 무엇이다 :

require 'HTTParty' 
require 'Nokogiri' 
require 'JSON' 
require 'Pry' 
require 'CSV' 

module Guns 
    class Scraper 
    page = HTTParty.get('http://www.gunviolencearchive.org/last-72-hours') 

    parse_page = Nokogiri::HTML(page) 
    incidents = Array.new 
    raw_table = parse_page.css('#block-system-main').css('.sticky-enabled') 
    table_entries = raw_table.xpath('//tbody')[0].children 
    state = table_entries.children[1].children.text 
    puts table_entries.children[1].children.text 

    table_entries.each do |entry| 
     puts entry.children[1].children.text 
    end 
    Pry.start(binding) 
    end 
end 

나는의 클라이언트 측에서 문자열 슬라이스를 할 수있을 것 최종 프로그램은이 문제를 해결할 수 없지만 오히려해야 할 일은 아닙니다.

+1

소문자로 사용하는 보석의 이름을 변환하는 것은 관용적입니다. 오류의 이미지를 보지 않고 오류의 필수/중요 부분을 텍스트로 복사하여 질문에 붙여 넣은 다음 적절히 형식을 지정해야합니다. 링크 썩어과 휴식과 그들이 당신의 질문을 할 때 많은 의미가되지 않습니다. "[mcve]"를 참조하십시오. 또한, 우리는 질문 자체에서 문제를 설명하는 페이지에서 추출한 절대 최소 HTML을 필요로합니다. –

답변

0

table_entries 개체는 nil과 같거나 table_entries.children[1]은 nil과 같습니다. 결과적으로 nil에있는 자식 메소드를 호출하고 children 메소드를 정의하지 않습니다. 이 같은 try 방법을 사용하는 유혹 될 수 있습니다

table_entries.children[1].try(:children).try(:text) 

을하지만이 값은 nil하고 그들이 당신은 당신의 코드가 실패 할 수있는 응용 프로그램의 설계에 해가없는 것을 확인할 수 있습니다 이유를 모른다면 아무 말 않고.

+0

아직도 나를 혼란스럽게합니다. 나는 터미널이 말한 것을 알고 있고, 무언가가 그러한 일을 일으키는 것은 의심의 여지가 없다.하지만 같은 참조를 사용하는 같은 문장이 왜 루프 외부에서 작동 할까? ruby ​​루프가 선언되는 방식이나 table_entries 변수의 실제 값에 대해 이해할 수없는 것이 있다고 가정합니다. 내가 원하는 모든 것은이 페이지의 테이블을 찢어 버리는 것입니다. http://www.gunviolencearchive.org/last-72-hours는 CSV에 그것을 작성합니다. – McBrideMusings

+0

스택 추적을 게시 할 수 있습니까? –