2009-11-10 63 views
0

我遇到问题我需要为我正在创建的Web MashUp提取信息的刮码。Html /脚本使用Hpricot(Ruby On Rails)刮掉Google地图

基本上,我试图从废代码:

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发展扩展)在Malta |黄页?? (马耳他)有限公司| YellowPages.com.mt

这也是当我在Firefox上查看源代码时看到的内容。但是,当我将鼠标悬停在Firebug中的元素上时,我能够获得一个XPath,由于脚本引用仍然存在,因此不幸的是这种XPath无法正常工作。 (我不知道如果我解释是正确的)。我真的需要由于脚本而在页面上生成的所有代码(这在远程只能在萤火虫中查看)。我需要这个,这样我可以提取将鼠标悬停在图标谷歌地图上,从萤火虫(采取如下:

<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和纬度,我真的需要我的项目,我真的不知道如何去做以另一种方式使用Hpricot,因为它没有给我所有我需要的代码。任何帮助将非常感激。

回答

5

这是一个有趣的。它可以完成,但是它会花更多的时间。我注意到,虽然 嗅探一个web服务被调用来填充经度和纬度。以下是您可以通过 获取该信息的方法:

通常情况下会刮掉网站,但要查找对LoadMap javascript 函数的调用。该行看起来像这样:

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

解析id并调用web服务。这将最终看起来像:

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 

希望这有助于。祝你好运!

+0

你真是个天才埃里克!非常感谢你,如果没有你的帮助,我不会得到解决方案。再次感谢 – Erika 2009-11-10 23:41:42

1

这种类型的屏幕抓取不起作用,因为您试图抓取页面的HTML发送到浏览器后动态添加到页面的元素。在这种情况下,浏览器是hpricot,它看到的只是从服务器发送的内容,而不是页面的JavaScript运行后的内容。

Firebug可以看到您试图抓取的元素的原因是,Firebug会分析浏览器中页面的当前状态,其中包括Google地图的动态脚本优点。