Html / Script Scraping Google Map с помощью Hpricot (Ruby On Rails) - PullRequest
0 голосов
/ 10 ноября 2009

У меня проблема с чисткой кода, которая требуется для извлечения информации для создаваемого веб-мэшапа.

Обычно я пытаюсь удалить код из:

http://yellowpages.com.mt/Meranti-Ltd-In-Malta-Gozo;/Hair-Accessories;Hijjhkikke=Hiojhhfokje.aspx

Это только одна из страниц, которые мне нужно будет почистить, и поэтому я не могу напрямую передать программе нужный мне код = /.

Когда я очищаю страницу, используя следующий код (в Hpricot)

puts open(ypUrl, 'User-Agent'=>'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2') { |f| Hpricot(f) }

Я заметил, что вместо части кода, которая мне требуется, я вижу только ссылку на скрипт, а именно

<script type="text/javascript" src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=false&amp;key=ABQIAAAA8JYIIyGmC1BLOU85GKKkPRSNQenRT-s-Gs-9sYb3ZSBhRRTdcRTMq3zWEID1E35uXl9bdQKIPQIjNQ"></script><title>

Beautimport Ltd (наращивание волос Balmain) на Мальте | Желтые страницы?? (Мальта) Лтд | YellowPages.com.mt

Это также то, что я вижу, когда делаю просмотр исходного кода в Firefox. Однако, когда я наведите курсор на элементы в Firebug, я смогу получить XPath, который, к сожалению, не работает из-за того, что ссылка на скрипт остается такой. (Я не уверен, правильно ли я объясняю). Мне бы действительно потребовался весь код, сгенерированный на странице из-за скрипта (который можно просмотреть только в Firebug). Мне нужно это, чтобы я мог извлечь следующее (взято из firebug, наведя на иконку Google на карте:

<a title="Click to see this area on Google Maps" href="http://maps.google.com/maps?ll=35.88805,14.46627&spn=0.006988,0.015922&z=16&key=ABQIAAAA8JYIIyGmC1BLOU85GKKkPRSNQenRT-s-Gs-9sYb3ZSBhRRTdcRTMq3zWEID1E35uXl9bdQKIPQIjNQ&sensor=false&mapclient=jsapi&oi=map_misc&ct=api_logo" target="_blank">

, который дает следующий Xpath (// обозначает tbody), но, как я уже говорил, поскольку он не дает весь код в Hpricot, он довольно бесполезен, так как не может добраться до него!

/html/body/form/table//tr/td/div/table[2]//tr[2]/td[2]/div/div[2]/table//tr/td/div/div[2]/a

Таким образом, я смогу извлечь Lng и Lat, которые мне действительно нужны для моего проекта. Я действительно не знаю, как сделать это по-другому, используя Hpricot, так как он не дает мне весь код, который мне требуется. Любая помощь будет чрезвычайно признательна.

Ответы [ 2 ]

5 голосов
/ 10 ноября 2009

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

Очистите сайт, как обычно, но ищите вызов JavaScript-кода LoadMap функция. Линия будет выглядеть примерно так:

<script type='text/javascript'>LoadMapByDetail(1668154, 0, 1)</script>

Разобрать идентификатор и позвонить в веб-службу. Это будет выглядеть примерно так:

require 'rubygems'
require 'hpricot' 
require 'open-uri' 
require 'soap/wsdlDriver'

WSDL_URL="http://yellowpages.com.mt/Web_Service/SearchMap.asmx?WSDL" 
soap = SOAP::WSDLDriverFactory.new(WSDL_URL).create_rpc_driver 
response = soap.GetCoordByDetail(:mainDetailID => '1668154', :type => '1')
soap.reset_stream response.getCoordByDetailResult.anyType.each { |x| puts x.anyType }

Вы видите широту и долготу в выходных данных:

35.88805
14.46627

Надеюсь, это поможет. Удачи!

1 голос
/ 10 ноября 2009

Этот тип очистки экрана не будет работать, поскольку вы пытаетесь получить элементы, которые добавляются на страницу динамически после отправки HTML-кода страницы в браузер. В этом случае браузер hpricot, и все, что он видит, это содержимое, отправленное с сервера, а не содержимое после запуска javascript страницы.

Причина, по которой Firebug видит элементы, которые вы пытаетесь захватить, заключается в том, что Firebug анализирует текущее состояние страницы в браузере, которое включает в себя динамическое качество сценариев из Карт Google.

...