Как перебрать все ссылки в div и собрать значения из открытых полей - PullRequest
0 голосов
/ 04 февраля 2012

Можно ли открыть каждую ссылку в определенном div и собрать все значения открытых полей в одном файле или хотя бы в выводе терминала?

Я пытаюсь получить список координат по всем маркерам, видимым на google map .

all_links = b.div(:id, "kmlfolders").links
all_links.each do |link|
   b.link.click
   b.link(:text, "Norādījumi").click
   puts b.text_field(:title, "Galapunkta_adrese").value
end

Существуют ли более простые или эффективные способы автоматического сбора координат со всех маркеров?

enter image description here

Ответы [ 2 ]

0 голосов
/ 10 марта 2012

Поскольку я еще не знаком с API Google, мне трудно разобраться в API для одной конкретной потребности. Для этого я сделал короткий скрипт watir-webdriver для сбора координат маркеров на защищенной карте Google. Результирующий файл используется в скрипте Python, который создает файлы speedcam для устройств навигации.

В данном случае это карта спидкама, которая поддерживается и обновляется латвийской полицией, но этот скрипт, вероятно, можно использовать с любой картой Google, просто заменив URL.

# encoding: utf-8
require "rubygems"
require "watir-webdriver"
@b = Watir::Browser.new :ff
#--------------------------------

@b.goto "http://maps.google.com/maps?source=s_q&f=q&hl=lv&geocode=&q=htt%2F%2Fmaps.google.com%2Fmaps%2Fms%3Fmsid%3D207561992958290099079.0004b731f1c645294488e%26msa%3D0%26output%3Dkml&aq=&sll=56.799934,24.5753&sspn=3.85093,8.64624&ie=UTF8&ll=56.799934,24.5753&spn=3.610137,9.887695&z=7&vpsrc=0&oi=map_misc&ct=api_logo"
@b.div(:id, "kmlfolders").wait_until_present
all_markers = @b.div(:id, "kmlfolders").divs(:class, "fdrlt")
@prev_coordinates = 1
puts "#{all_markers.length} speedcam markers detected"

File.open("list_of_coordinates.txt","w") do |outfile|
all_markers.each do |marker|
    sleep 1
    marker.click
    sleep 1
    description = @b.div(:id => "iw_kml").text
    @b.span(:class, "actbar-text").click
    sleep 2
    coordinates = @b.text_field(:name, "daddr").value
    redo if coordinates == @prev_coordinates
    puts coordinates
    outfile.puts coordinates
    @prev_coordinates = coordinates
end
end

puts "Coordinates saved in file!"

@b.close

Работает как на Mac OSX 10.7, так и на Windows7.

0 голосов
/ 15 февраля 2012

Если в HTML уже нет других данных (alt tags? Elements, вызванных через onhover?), Которые вы можете выбрать, это кажется наиболее практичным способом итерации по ссылкам, однако, как я вижу, выфактически не использующий объект 'link' внутри вашего цикла.Я думаю, вам нужно что-то более похожее на это

all_links = b.div(:id, "kmlfolders").links
all_links.each do |thelink|
   b.link(:href => thelink.href).click
   b.link(:text, "Norādījumi").click
   puts b.text_field(:title, "Galapunkta_adrese").value
end

Вероятно, использование их API является гораздо более эффективным средством для получения того, что вы хотите, однако, именно поэтому люди все-таки создают API, и если таковой имеется,тогда использовать его почти всегда лучше.Использование тестового инструмента в качестве скребка для сбора информации может оказаться намного сложнее в долгосрочной перспективе, чем научиться делать некоторые вызовы API и получать данные таким образом.

для веб-интерфейсов API и Ruby. Я считаю, что REST-CLIENT gem прекрасно работает, другие люди, такие как HTTP-Party

...