2009-11-10 64 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地圖的動態腳本優點。