2016-08-17 1 views
0

안녕하세요 방금 다음 자습서를 완료했습니다 : https://github.com/ryandhaase/Web-Scraper/blob/master/airbnb_scraper.rbhttps://medium.com/@tabor_francesca/web-scraper-airbnb-24d67939b08a#.mg7ny2tke. 그리고 나는 지금 연습하고있다. 하위 배열을 나누는 데 문제가 있습니다. 모든 것이 작동하지만 도시, 주 및 우편 번호를 별도의 Excel 열로 나눌 수는 없습니다.ruby ​​nokogiri 웹 스크레이퍼에서 분할 하위 배열

다음 줄이 잘못되었습니다. 어떻게 해결할 수 있습니까?

city << [subarray[0], "this is not working", subarray[1]] 

내 생각에는 수정해야 할 다른 줄이 있습니다. 그냥 참고로

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 
require 'csv' 


url = "https://www.tesla.com/findus/list/stores/United+States" 

page = Nokogiri::HTML(open(url)) 

page = Nokogiri::HTML(open("https://www.tesla.com/findus/list/stores/United+States")) 
puts page.class 

name = [] 
street_address = [] 
extended_address = [] 
city = [] 
state = [] 
zip = [] 


    page.css('a.fn.org.url').each do |line| 
     name << line.text.strip 
    end 

    page.css('span.street-address').each do |line| 
     street_address << line.text 
    end 

    page.css('span.extended-address').each do |line| 
     extended_address << line.text 
    end 

    page.css('span.locality').each do |line| 
     subarray = line.text.strip.split(/ · /) 

     if subarray.length == 3 
      city << subarray 
     else 
      city << [subarray[0], "this is not working", subarray[1]] 
    end 

    end 



CSV.open("teslaStores.csv", "w") do |file| 
    file << ["Name", "Street Address", "Street Address Continued", "City", "State", "Zip"] 

    name.length.times do |i| 
    file << [name[i], street_address[i], extended_address[i], city[i], city[i][0], city[i][1]] 
    end 
end 
+4

당신이지고있어 오류가 무엇을, BTW, 외모 이에

page.css('span.locality').each do |line| subarray = line.text.strip.split(/ · /) if subarray.length == 3 city << subarray else city << [subarray[0], "this is not working", subarray[1]] end 

:

나는이를 변경했다 'if subarray.length == 3'를 닫는'end'가 없습니다. – fanta

+2

라인이 올바르지 않아서 고쳐야한다는 것은 무엇을 의미합니까? 오류가 무엇입니까? 그 결과에 무슨 문제가 있습니까? –

+2

스택 오버플로에 오신 것을 환영합니다. 질문에 대해 더 많은 작업을해야합니다. "[mcve]"를 읽으십시오. 문제의 정확한 코드를 보여주기 위해 질문에 최소한의 코드가 필요하고 문제를 보여줄 질문에 최소한의 HTML과 예상되는 결과가 필요합니다. 문제를 단순화하면 코드가 중복되어 코드가 잘 나오지만 해결책을 찾을 수 있습니다. CSV를 제거하고 데이터를 찾아서 추출한 다음 원하는 형식으로 분리하십시오. "[ask]"링크 된 페이지, 특히 링크 된 페이지도 도움이 될 것입니다. –

답변

0

그래서 나는 갔다 python의 meetup.com 이벤트에 참여하고 수업이이 주제와 관련이 없다고해도 도움이 필요하면 지시 사항 중 하나를 요청했습니다. :). 선생님은 쉼표와 공백으로 나누어야한다고 설명했습니다. 내가 몇 마디 전에 쪼개기 전에.

page.css('span.locality').each do |line| 
     subarray = line.text.strip.split(',') 
     subarray2 = subarray[1].split(' ') 

      city << subarray[0] 
      state << subarray2[0] 
      zip << subarray2[1] 
    end 

여기에 전체 대답 :?

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 
require 'csv' 


url = "https://www.tesla.com/findus/list/stores/United+States" 

page = Nokogiri::HTML(open(url)) 

page = Nokogiri::HTML(open("https://www.tesla.com/findus/list/stores/United+States")) 
puts page.class 

name = [] 
street_address = [] 
extended_address = [] 
city = [] 
state = [] 
zip = [] 


    page.css('a.fn.org.url').each do |line| 
     name << line.text.strip 
    end 

    page.css('span.street-address').each do |line| 
     street_address << line.text 
    end 

    page.css('span.extended-address').each do |line| 
     extended_address << line.text 
    end 

    page.css('span.locality').each do |line| 
     subarray = line.text.strip.split(',') 
     subarray2 = subarray[1].split(' ') 

      city << subarray[0] 
      state << subarray2[0] 
      zip << subarray2[1] 
    end 


CSV.open("teslaStores.csv", "w") do |file| 
    file << ["Name", "Street Address", "Street Address Continued", "City", "State", "Zip"] 

    name.length.times do |i| 
    file << [name[i], street_address[i], extended_address[i], city[i], state[i], zip[i]] 
    end 
end 
0

,이 안된이며,보다 관용적 루비 코드 :

require 'csv' 
require 'nokogiri' 
require 'open-uri' 

page = Nokogiri::HTML(open('https://www.tesla.com/findus/list/stores/United+States')) 

name = page.css('a.fn.org.url').map{ |n| n.text.strip } 
street_address = page.css('span.street-address').map { |n| n.text } 
extended_address = page.css('span.extended-address').map{ |n| n.text } 

city = page.css('span.locality').map { |n| 
    subarray = n.text.strip.split(/ · /) 

    if subarray.length == 3 
    subarray 
    else 
    [subarray[0], 'this is not working', subarray[1]] 
    end 

} 

CSV.open('teslaStores.csv', 'w') do |file| 
    file << ['Name', 'Street Address', 'Street Address Continued', 'City', 'State', 'Zip'] 

    name.length.times do |i| 
    file << [name[i], street_address[i], extended_address[i], city[i], city[i][0], city[i][1]] 
    end 
end 

그리고 조금 더 감소 될 수있다 :

street_address, extended_address = [ 
    'span.street-address', 
    'span.extended-address' 
].map{ |selector| 
    page.css(selector).map { |n| n.text } 
} 
+0

코드가 실행되지만 내 열 문제를 해결하지 못합니다. 'else [subarray [0], '이것은 작동하지 않습니다.', subarray [1]] end' – runningraptor

+0

코드는 아니 었습니다.이 코드는 별개의 열에 도시, 주 및 우편 번호가 표시되도록 변경하는 방법을 알고 있습니다. 이 문제를 해결하기위한 시도로서 Ruby 개발에 관용적 인 코드를 작성할 때까지 올바른 길을 찾아가는 것이 었습니다. 다른 말로하면, 코드 리뷰에서 동료들에 의해 작업에 넘어 가지 않게하는 스타일로 작성하는 것입니다. –