Eri*_*ika 0 html google-maps screen-scraping hpricot ruby-on-rails
我有一个问题Scraping Code我需要提取我正在创建的Web MashUp的信息.
基本上,我正在尝试从以下代码中删除代码:
http://yellowpages.com.mt/Meranti-Ltd-In-Malta-Gozo;/Hair-Accessories;Hijjhkikke=Hiojhhfokje.aspx
Run Code Online (Sandbox Code Playgroud)
这只是我需要抓取的页面之一,因此我无法直接向程序提供我需要的代码= /.
当我使用以下代码刮擦页面时(在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) }
Run Code Online (Sandbox Code Playgroud)
我注意到,而不是我需要的代码部分,我只看到脚本引用,即
<script type="text/javascript" src="http://maps.google.com/maps?file=api&v=2&sensor=false&key=ABQIAAAA8JYIIyGmC1BLOU85GKKkPRSNQenRT-s-Gs-9sYb3ZSBhRRTdcRTMq3zWEID1E35uXl9bdQKIPQIjNQ"></script><title>
Run Code Online (Sandbox Code Playgroud)
Beautimport Ltd(Balmain Hair Extensions)在马耳他| 黄页??(Malta)Ltd | YellowPages.com.mt
这也是我在Firefox上查看源代码时看到的内容.但是,当我将鼠标悬停在Firebug中的元素上时,我能够获得一个XPath,由于脚本引用仍然存在,因此很遗忘.(我不确定我的解释是否正确).由于脚本(我只能在firebug中查看),我真的需要在页面上生成的所有代码.我需要这个,以便我可以提取以下内容(通过悬停在地图上的Google图标上从firebug中获取:
<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">
Run Code Online (Sandbox Code Playgroud)
它提供了以下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
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我将能够提取我的项目真正需要的Lng和Lat.我真的不知道如何使用Hpricot以另一种方式解决这个问题,因为它没有给我所需的所有代码.任何帮助都将非常感激.
这是一个有趣的.它可以做到,但它将需要更多的hpricot.我注意到在嗅探时正在调用一个web服务来填充纬度和经度.您可以通过以下方式获取该信息:
像往常一样抓取网站,但是寻找对LoadMap javascript函数的调用.该行看起来像:
<script type='text/javascript'>LoadMapByDetail(1668154, 0, 1)</script>
Run Code Online (Sandbox Code Playgroud)
解析id并调用webservice.这将最终看起来像:
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 }
Run Code Online (Sandbox Code Playgroud)
您可以在输出中看到纬度和经度:
35.88805
14.46627
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.祝好运!