2016-08-17 13 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]] 

私の推測では、修正が必要な別の行があります。ただ、FYIとして

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

あなたが取得しているエラーは、何が、ところで、ルックスこれに

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イベントに参加し、このトピックにクラスがない場合でも、指示の1つに援助を求めました:)。先生は、コンマとスペースで分割する必要があると説明しました。私が前にどこかに分けていたところ。

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

、これはテストされていないが、より慣用的な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]、 'これは機能していません'、サブアレイ[1]] end' – runningraptor

+0

コードはありませんでした。この問題を解決しようとする試みでは、Ruby開発に慣例的なコードを書いている限り、正しい軌道に乗ることができました。言い換えれば、コードレビューの際に他の人が作業に追い込まれないようなスタイルで書くことです。 –

関連する問題