2016-08-17 2 views
0

Здравствуйте, я только что закончил следующие уроки: https://github.com/ryandhaase/Web-Scraper/blob/master/airbnb_scraper.rb и https://medium.com/@tabor_francesca/web-scraper-airbnb-24d67939b08a#.mg7ny2tke. И теперь я тренируюсь. У меня возникают проблемы с разделением подмассивов. Все работает, но я не могу разделить город, штат и почтовый индекс на отдельные столбцы excel.Разделение подмассивов в рубине nokogiri web scraper

Следующая строка является неверной, как я могу ее исправить?

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

что ошибка, вы получаете, кстати, выглядит например, вам не хватает 'end', чтобы закрыть' if subarray.length == 3'. – fanta

+2

Что вы имеете в виду, эта строка неверна, и вам нужно ее исправить? Какая ошибка? Что случилось с результатом? –

+2

Добро пожаловать в переполнение стека. Вам нужно немного поработать над вашим вопросом. Пожалуйста, прочитайте «[mcve]». Нам нужен минимальный код в вашем вопросе, чтобы продемонстрировать точную проблему, с которой вы сталкиваетесь, минимальный HTML в своем вопросе, чтобы показать проблему, а также ваш ожидаемый результат. Если вы упростите проблему/код, чтобы дублировать его, все будет хорошо, вы найдете решение; удалите CSV и сосредоточьтесь на поиске и извлечении данных, а затем разбивайте их в желаемый формат. «[ask]», и связанные страницы также помогут, особенно связанные страницы. –

ответ

0

Итак, я пошел на мероприятие meetup.com на python и попросил одну из инструкций по оказанию помощи, даже если класс не был в этом разделе :). Учитель объяснил, что мне нужно разделить запятыми и пробелами. Где раньше я разбивался по периодам.

мне пришлось изменить:

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 

Для этого:

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

Подобно тому, как FYI, это проверялось, но более идиоматических код в Ruby:

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], 'this is not working', subarray [1]] end' – runningraptor

+0

Код wasn ' t попытка решить проблему, это должно было сделать вас на правильном пути, насколько писать код, который идиоматичен для разработки Ruby. Другими словами, написать его в стиле, который не позволит вам быть привлеченным к заданию сверстниками в обзоре кода. –

Смежные вопросы