applephile 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/get_apple_products +1 -1
- data/lib/applephile.rb +6 -1
- data/lib/applephile/city.rb +24 -0
- data/lib/applephile/command_line_interface.rb +139 -0
- data/lib/applephile/craigslist.rb +106 -0
- data/lib/applephile/item.rb +9 -0
- data/lib/applephile/version.rb +1 -1
- metadata +5 -5
- data/lib/city.rb +0 -22
- data/lib/command_line_interface.rb +0 -89
- data/lib/craigslist.rb +0 -106
- data/lib/item.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3618935c4e88ada9eea742356249211938111ec7f71caaa4ed3847bd905256d8
|
4
|
+
data.tar.gz: cf806e277f666de2db140762b401663178a7beb9742fea9fdc7b36b50cdaf10b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae3d3f9b7e1fefb353d6c95035c0fa35ff481566567b076378b1df0bfc53ab6e52ef820feb782df256f34c5e77fbaca0d44d14a96827d6d8c3a05a2d704d18b6
|
7
|
+
data.tar.gz: 710e4ec59c56177a6d8f1dfc6c8a7463370a7ec459a604a5d0781cc5c88dde087e24e83e5a76f774e33f42e50afd2d460425e44ca6dfb62e76ace1293da26233
|
data/bin/get_apple_products
CHANGED
data/lib/applephile.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
module Applephile
|
2
|
+
class City
|
3
|
+
attr_accessor :name, :state, :city_url
|
4
|
+
attr_reader :items
|
5
|
+
|
6
|
+
@@all = []
|
7
|
+
|
8
|
+
def initialize(city_attributes)
|
9
|
+
city_attributes.each {|key, value| self.send(("#{key}="), value)}
|
10
|
+
@items = []
|
11
|
+
@@all << self
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_item(item)
|
15
|
+
item.city = self
|
16
|
+
@items << item
|
17
|
+
item
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_apple_prods_by_price(set_price)
|
21
|
+
@items.select { |item| item.price.to_i >= set_price.to_i }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
module Applephile
|
2
|
+
class CLI
|
3
|
+
INTRO_MESSAGE = "WELCOME TO CRAIGSLIST SCRAPPER!"
|
4
|
+
|
5
|
+
def run
|
6
|
+
@scrape = Applephile::CraigsList.new
|
7
|
+
puts INTRO_MESSAGE
|
8
|
+
choice = ""
|
9
|
+
while choice != "exit"
|
10
|
+
choice = display_main_menu
|
11
|
+
if choice == "scrape"
|
12
|
+
get_menu_input
|
13
|
+
create_items_from_array(scrape_apple_prodcuts)
|
14
|
+
grab_apple_prodcuts
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def display_main_menu
|
21
|
+
stars = "************************".colorize(:yellow)
|
22
|
+
puts "#{stars} MAIN MENU #{stars}"
|
23
|
+
puts "Enter \"scrape\" to scrape.".colorize(:blue)
|
24
|
+
puts "Enter \"exit\" to end program.".colorize(:yellow)
|
25
|
+
puts "What would you like to do?".colorize(:blue)
|
26
|
+
gets.chomp
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_menu_input
|
30
|
+
display_states
|
31
|
+
puts "Please enter a number for the state you'd like to scrape.".colorize(:green)
|
32
|
+
#convert number input from user
|
33
|
+
@state_scraped = convert_to_state(gets.chomp)
|
34
|
+
display_cities(@state_scraped)
|
35
|
+
puts "Please enter a number for the city you'd like to scrape.".colorize(:green)
|
36
|
+
@city_scraped = convert_to_city(@state_scraped, gets.chomp)
|
37
|
+
puts "You have chosen the state of #{@state_scraped}, and the city of #{@city_scraped.capitalize}."
|
38
|
+
end
|
39
|
+
|
40
|
+
def display_states
|
41
|
+
@scrape.get_states_names.each_with_index do |state, index|
|
42
|
+
print "#{index + 1}. #{state} ".ljust(28)
|
43
|
+
if (index + 1) % 5 == 0
|
44
|
+
print "\n"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
print "\n"
|
48
|
+
end
|
49
|
+
|
50
|
+
def display_cities(state)
|
51
|
+
@state_cities = @scrape.get_state_cities(state)
|
52
|
+
#find max length of city and use it left justify everything else for screen output
|
53
|
+
max_length = @state_cities.map(&:length).max
|
54
|
+
@state_cities.each_with_index do |city, index|
|
55
|
+
print "#{index + 1}. #{city.capitalize.ljust(max_length)} "
|
56
|
+
if (index + 1) % 3 == 0
|
57
|
+
print "\n"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
print "\n"
|
61
|
+
end
|
62
|
+
|
63
|
+
def convert_to_state(state_number)
|
64
|
+
#it takes in a number and returns the corresponding state's name
|
65
|
+
@scrape.get_states_names[state_number.to_i - 1]
|
66
|
+
end
|
67
|
+
|
68
|
+
def convert_to_city(state, city_number)
|
69
|
+
#it takes in a number and returns the corresponding city's name
|
70
|
+
@state_cities[city_number.to_i - 1]
|
71
|
+
end
|
72
|
+
|
73
|
+
def scrape_apple_prodcuts
|
74
|
+
@scraped_city_url = @scrape.return_city_link(@state_scraped, @city_scraped)
|
75
|
+
@phones = @scrape.scrape_by_city_url(@scraped_city_url)
|
76
|
+
end
|
77
|
+
|
78
|
+
def grab_apple_prodcuts
|
79
|
+
puts "Price enter a price higher than 150 to see the list of phones, defualt price is 150.".colorize(:blue)
|
80
|
+
display_apple_products_info(@city.get_apple_prods_by_price(gets.chomp))
|
81
|
+
end
|
82
|
+
|
83
|
+
def create_items_from_array(phones_array)
|
84
|
+
if phones_array.empty?
|
85
|
+
puts "Your search return zero hits, please scrape again"
|
86
|
+
get_menu_input
|
87
|
+
create_items_from_array(scrape_apple_products())
|
88
|
+
else
|
89
|
+
@city = Applephile::City.new({:name => @city_scraped, :state => @state_scraped,
|
90
|
+
:city_url => @scraped_city_url})
|
91
|
+
phones_array.each do |phone_info|
|
92
|
+
@city.add_item(Applephile::Item.new(phone_info))
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def display_apple_products_info(apple_products)
|
98
|
+
separator = "-+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+-+".colorize(:yellow)
|
99
|
+
puts "The following phones were found in accordance to your search parameters."
|
100
|
+
choice = ""
|
101
|
+
while choice != "exit"
|
102
|
+
apple_products.each_with_index do |product, index|
|
103
|
+
puts "#{index + 1}: #{product.description}"
|
104
|
+
puts "Price: $#{product.price}"
|
105
|
+
puts "Phone's url: #{product.url}"
|
106
|
+
puts "Phone's City: #{product.city.name}"
|
107
|
+
puts separator
|
108
|
+
|
109
|
+
if (index + 1) % 5 == 0
|
110
|
+
# puts "Enter number to see link phone on browser.".colorize(:cyan)
|
111
|
+
# puts "next for more phones".colorize(:green)
|
112
|
+
# puts "Or enter exit to re-scrape.".colorize(:blue)
|
113
|
+
|
114
|
+
choice = get_choice
|
115
|
+
if choice == "next"
|
116
|
+
next
|
117
|
+
elsif choice == 'exit'
|
118
|
+
break
|
119
|
+
else
|
120
|
+
#make sure screen stays on all present create_items_from_array
|
121
|
+
phone_url = apple_products[choice.to_i - 1].url
|
122
|
+
system("open", phone_url)
|
123
|
+
choice = get_choice
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
puts "There are no moh phones to show."
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def get_choice
|
132
|
+
puts "Enter number to see link phone on browser.".colorize(:cyan)
|
133
|
+
puts "next for more phones".colorize(:green)
|
134
|
+
puts "Or enter exit to re-scrape.".colorize(:blue)
|
135
|
+
gets.chomp
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'pry'
|
4
|
+
|
5
|
+
module Applephile
|
6
|
+
class CraigsList
|
7
|
+
attr_accessor :site_url, :doc
|
8
|
+
|
9
|
+
def initialize()
|
10
|
+
@site_url = "https://www.craigslist.org/about/sites"
|
11
|
+
@doc = Nokogiri::HTML(open(@site_url))
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_states_names
|
15
|
+
#it returns an array of states of the U.S., CLI will use to display them
|
16
|
+
doc.css(".colmask").first.css("h4").collect { |st| st.text}
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_state_cities(state_name)
|
20
|
+
#it returns an array of cities belonging to a particular state
|
21
|
+
#1. find the state first.
|
22
|
+
#2. then collect the state's city array, return a flatten array so only cities can be used
|
23
|
+
#to be displayed in CLI
|
24
|
+
state_cities_array = []
|
25
|
+
states_cities_links.each do |states, cities_links|
|
26
|
+
if states.to_s == state_name
|
27
|
+
#collect only cities
|
28
|
+
state_cities_array = cities_links.collect { |city| city.keys }
|
29
|
+
break
|
30
|
+
end
|
31
|
+
end
|
32
|
+
state_cities_array.flatten!
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
def return_city_link(state, city)
|
37
|
+
#it returns the link of a particular city
|
38
|
+
#1. find state hash
|
39
|
+
#2. find the city
|
40
|
+
#3. get city's link
|
41
|
+
city_url = ""
|
42
|
+
states_cities_links.find do |key, value|
|
43
|
+
if key.to_s == state
|
44
|
+
value.find do |city_hash|
|
45
|
+
if city_hash.has_key?(city)
|
46
|
+
city_url = city_hash[city]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
city_url
|
52
|
+
end
|
53
|
+
def scrape_by_city_url(city_url)
|
54
|
+
items_array_of_hashes = []
|
55
|
+
#1. returns an array of hashes for every link (phone found) for a particular scrape criteria
|
56
|
+
#2. build site link with searching criteria phones with pic, new, os
|
57
|
+
#3. grab all phones that meet this search criteria.
|
58
|
+
#4. traverse the collection, and grab each needed attribute one by one.
|
59
|
+
#5. build hash, and save it to array.
|
60
|
+
#6. return hash
|
61
|
+
city_url = city_url + "search/moa?hasPic=1&condition=10&mobile_os=2"
|
62
|
+
city_doc = Nokogiri::HTML(open(city_url))
|
63
|
+
grab_all_phones = city_doc.css(".result-info")
|
64
|
+
grab_all_phones.each do |phones|
|
65
|
+
phone_url = phones.css("a")[0]["href"]
|
66
|
+
phone_price = phones.css(".result-price").text.split("$")[1]
|
67
|
+
phone_description = phones.css("a").text.split("\n")[0]
|
68
|
+
items_array_of_hashes.push({:url => phone_url,
|
69
|
+
:price => phone_price,
|
70
|
+
:description => phone_description})
|
71
|
+
end
|
72
|
+
items_array_of_hashes
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def cities_and_links
|
79
|
+
#it returns a two dimensional array of cities, with their links as a hash by the state
|
80
|
+
# [[{"citya" => linka}, {"cityb" => linkb}, {"cityc" => linkc}], [{"cityz" => linkz}]]
|
81
|
+
|
82
|
+
two_dimension_city = []
|
83
|
+
doc.css(".colmask").first.css("ul").each do |city|
|
84
|
+
#collect returns [{"city1" => link1}, {city2 => link2}]
|
85
|
+
#collect removes "/" and unnecessary spaces from cities
|
86
|
+
two_dimension_city.push(city.css("li a").collect { |city| { city.text.split("/")[0].strip => city["href"] }})
|
87
|
+
end
|
88
|
+
two_dimension_city
|
89
|
+
end
|
90
|
+
|
91
|
+
def states_cities_links
|
92
|
+
#returns a array of hashes with keys equal to states, and values
|
93
|
+
#equal to an array of cities and their respective links
|
94
|
+
#{ :state1 => [{"city1" => link1}, {city2 => link2}, {city3 => link3}],
|
95
|
+
# :state2 => [{}]}
|
96
|
+
|
97
|
+
states_cities_links_hash = {}
|
98
|
+
#proceed by states, make hash, then push into array
|
99
|
+
#cities index implicitly starts from the first state
|
100
|
+
get_states_names.each_with_index do |state, index|
|
101
|
+
states_cities_links_hash[state.to_sym] = cities_and_links[index]
|
102
|
+
end
|
103
|
+
states_cities_links_hash
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
data/lib/applephile/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: applephile
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ramon Chavez
|
@@ -116,11 +116,11 @@ files:
|
|
116
116
|
- bin/setup
|
117
117
|
- config/environment.rb
|
118
118
|
- lib/applephile.rb
|
119
|
+
- lib/applephile/city.rb
|
120
|
+
- lib/applephile/command_line_interface.rb
|
121
|
+
- lib/applephile/craigslist.rb
|
122
|
+
- lib/applephile/item.rb
|
119
123
|
- lib/applephile/version.rb
|
120
|
-
- lib/city.rb
|
121
|
-
- lib/command_line_interface.rb
|
122
|
-
- lib/craigslist.rb
|
123
|
-
- lib/item.rb
|
124
124
|
- touch
|
125
125
|
homepage: https://github.com/rachavez1974/applephile
|
126
126
|
licenses:
|
data/lib/city.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
class City
|
2
|
-
attr_accessor :name, :state, :city_url
|
3
|
-
attr_reader :items
|
4
|
-
|
5
|
-
@@all = []
|
6
|
-
|
7
|
-
def initialize(city_attributes)
|
8
|
-
city_attributes.each {|key, value| self.send(("#{key}="), value)}
|
9
|
-
@items = []
|
10
|
-
@@all << self
|
11
|
-
end
|
12
|
-
|
13
|
-
def add_item(item)
|
14
|
-
item.city = self
|
15
|
-
@items << item
|
16
|
-
item
|
17
|
-
end
|
18
|
-
|
19
|
-
def get_apple_prods_by_price(set_price)
|
20
|
-
@items.select { |item| item.price.to_i >= set_price.to_i }
|
21
|
-
end
|
22
|
-
end
|
@@ -1,89 +0,0 @@
|
|
1
|
-
class CLI
|
2
|
-
INTRO_MESSAGE = "WELCOME TO CRAIGSLIST SCRAPPER!"
|
3
|
-
|
4
|
-
def run
|
5
|
-
@scrape = CraigsList.new
|
6
|
-
puts INTRO_MESSAGE
|
7
|
-
choice = ""
|
8
|
-
while choice != "exit"
|
9
|
-
choice = display_main_menu
|
10
|
-
if choice == "scrape"
|
11
|
-
get_menu_input
|
12
|
-
create_items_from_array(scrape_apple_prodcuts)
|
13
|
-
grab_apple_prodcuts
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
def display_main_menu
|
20
|
-
stars = "************************".colorize(:yellow)
|
21
|
-
puts "#{stars} MAIN MENU #{stars}"
|
22
|
-
puts "Enter \"scrape\" to scrape.".colorize(:blue)
|
23
|
-
puts "Enter \"exit\" to end program.".colorize(:yellow)
|
24
|
-
puts "What would you like to do?".colorize(:blue)
|
25
|
-
gets.chomp
|
26
|
-
end
|
27
|
-
|
28
|
-
def get_menu_input
|
29
|
-
display_states
|
30
|
-
puts "Please enter a number for the state you'd like to scrape.".colorize(:green)
|
31
|
-
#convert number input from user
|
32
|
-
@state_scraped = convert_to_state(gets.chomp)
|
33
|
-
display_cities(@state_scraped)
|
34
|
-
puts "Please enter a number for the city you'd like to scrape.".colorize(:green)
|
35
|
-
@city_scraped = convert_to_city(@state_scraped, gets.chomp)
|
36
|
-
puts "You have chosen the state of #{@state_scraped}, and the city of #{@city_scraped.capitalize}."
|
37
|
-
end
|
38
|
-
|
39
|
-
def display_states
|
40
|
-
@scrape.get_states_names.each_with_index do |state, index|
|
41
|
-
print "#{index + 1}. #{state} ".ljust(28)
|
42
|
-
if (index + 1) % 5 == 0
|
43
|
-
print "\n"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
print "\n"
|
47
|
-
end
|
48
|
-
|
49
|
-
def display_cities(state)
|
50
|
-
@state_cities = @scrape.get_state_cities(state)
|
51
|
-
#find max length of city and use it left justify everything else for screen output
|
52
|
-
max_length = @state_cities.map(&:length).max
|
53
|
-
@state_cities.each_with_index do |city, index|
|
54
|
-
print "#{index + 1}. #{city.capitalize.ljust(max_length)} "
|
55
|
-
if (index + 1) % 3 == 0
|
56
|
-
print "\n"
|
57
|
-
end
|
58
|
-
end
|
59
|
-
print "\n"
|
60
|
-
end
|
61
|
-
|
62
|
-
def convert_to_state(state_number)
|
63
|
-
#it takes in a number and returns the corresponding state's name
|
64
|
-
@scrape.get_states_names[state_number.to_i - 1]
|
65
|
-
end
|
66
|
-
|
67
|
-
def convert_to_city(state, city_number)
|
68
|
-
#it takes in a number and returns the corresponding city's name
|
69
|
-
@state_cities[city_number.to_i - 1]
|
70
|
-
end
|
71
|
-
|
72
|
-
def scrape_apple_prodcuts
|
73
|
-
@scraped_city_url = @scrape.return_city_link(@state_scraped, @city_scraped)
|
74
|
-
@phones = @scrape.scrape_by_city_url(@scraped_city_url)
|
75
|
-
end
|
76
|
-
|
77
|
-
def grab_apple_prodcuts
|
78
|
-
puts "Price enter a price higher than 150 to see the list of phones, defualt price is 150.".colorize(:blue)
|
79
|
-
display_apple_products_info(@city.get_apple_prods_by_price(gets.chomp))
|
80
|
-
end
|
81
|
-
|
82
|
-
def get_choice
|
83
|
-
puts "Enter number to see link phone on browser.".colorize(:cyan)
|
84
|
-
puts "next for more phones".colorize(:green)
|
85
|
-
puts "Or enter exit to re-scrape.".colorize(:blue)
|
86
|
-
gets.chomp
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|
data/lib/craigslist.rb
DELETED
@@ -1,106 +0,0 @@
|
|
1
|
-
require 'nokogiri'
|
2
|
-
require 'open-uri'
|
3
|
-
require 'pry'
|
4
|
-
|
5
|
-
class CraigsList
|
6
|
-
attr_accessor :site_url, :doc
|
7
|
-
|
8
|
-
def initialize()
|
9
|
-
@site_url = "https://www.craigslist.org/about/sites"
|
10
|
-
@doc = Nokogiri::HTML(open(@site_url))
|
11
|
-
end
|
12
|
-
|
13
|
-
def get_states_names
|
14
|
-
#it returns an array of states of the U.S., CLI will use to display them
|
15
|
-
doc.css(".colmask").first.css("h4").collect { |st| st.text}
|
16
|
-
end
|
17
|
-
|
18
|
-
def get_state_cities(state_name)
|
19
|
-
#it returns an array of cities belonging to a particular state
|
20
|
-
#1. find the state first.
|
21
|
-
#2. then collect the state's city array, return a flatten array so only cities can be used
|
22
|
-
#to be displayed in CLI
|
23
|
-
state_cities_array = []
|
24
|
-
states_cities_links.each do |states, cities_links|
|
25
|
-
if states.to_s == state_name
|
26
|
-
#collect only cities
|
27
|
-
state_cities_array = cities_links.collect { |city| city.keys }
|
28
|
-
break
|
29
|
-
end
|
30
|
-
end
|
31
|
-
state_cities_array.flatten!
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
def return_city_link(state, city)
|
36
|
-
#it returns the link of a particular city
|
37
|
-
#1. find state hash
|
38
|
-
#2. find the city
|
39
|
-
#3. get city's link
|
40
|
-
city_url = ""
|
41
|
-
states_cities_links.find do |key, value|
|
42
|
-
if key.to_s == state
|
43
|
-
value.find do |city_hash|
|
44
|
-
if city_hash.has_key?(city)
|
45
|
-
city_url = city_hash[city]
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
city_url
|
51
|
-
end
|
52
|
-
def scrape_by_city_url(city_url)
|
53
|
-
items_array_of_hashes = []
|
54
|
-
#1. returns an array of hashes for every link (phone found) for a particular scrape criteria
|
55
|
-
#2. build site link with searching criteria phones with pic, new, os
|
56
|
-
#3. grab all phones that meet this search criteria.
|
57
|
-
#4. traverse the collection, and grab each needed attribute one by one.
|
58
|
-
#5. build hash, and save it to array.
|
59
|
-
#6. return hash
|
60
|
-
city_url = city_url + "search/moa?hasPic=1&condition=10&mobile_os=2"
|
61
|
-
city_doc = Nokogiri::HTML(open(city_url))
|
62
|
-
grab_all_phones = city_doc.css(".result-info")
|
63
|
-
grab_all_phones.each do |phones|
|
64
|
-
phone_url = phones.css("a")[0]["href"]
|
65
|
-
phone_price = phones.css(".result-price").text.split("$")[1]
|
66
|
-
phone_description = phones.css("a").text.split("\n")[0]
|
67
|
-
items_array_of_hashes.push({:url => phone_url,
|
68
|
-
:price => phone_price,
|
69
|
-
:description => phone_description})
|
70
|
-
end
|
71
|
-
items_array_of_hashes
|
72
|
-
end
|
73
|
-
|
74
|
-
|
75
|
-
private
|
76
|
-
|
77
|
-
def cities_and_links
|
78
|
-
#it returns a two dimensional array of cities, with their links as a hash by the state
|
79
|
-
# [[{"citya" => linka}, {"cityb" => linkb}, {"cityc" => linkc}], [{"cityz" => linkz}]]
|
80
|
-
|
81
|
-
two_dimension_city = []
|
82
|
-
doc.css(".colmask").first.css("ul").each do |city|
|
83
|
-
#collect returns [{"city1" => link1}, {city2 => link2}]
|
84
|
-
#collect removes "/" and unnecessary spaces from cities
|
85
|
-
two_dimension_city.push(city.css("li a").collect { |city| { city.text.split("/")[0].strip => city["href"] }})
|
86
|
-
end
|
87
|
-
two_dimension_city
|
88
|
-
end
|
89
|
-
|
90
|
-
def states_cities_links
|
91
|
-
#returns a array of hashes with keys equal to states, and values
|
92
|
-
#equal to an array of cities and their respective links
|
93
|
-
#{ :state1 => [{"city1" => link1}, {city2 => link2}, {city3 => link3}],
|
94
|
-
# :state2 => [{}]}
|
95
|
-
|
96
|
-
states_cities_links_hash = {}
|
97
|
-
#proceed by states, make hash, then push into array
|
98
|
-
#cities index implicitly starts from the first state
|
99
|
-
get_states_names.each_with_index do |state, index|
|
100
|
-
states_cities_links_hash[state.to_sym] = cities_and_links[index]
|
101
|
-
end
|
102
|
-
states_cities_links_hash
|
103
|
-
end
|
104
|
-
|
105
|
-
|
106
|
-
end
|