2009-11-10 8 views
0

J'ai un problème Scraping Code dont j'ai besoin pour extraire des informations pour un Web MashUp que je crée.Html/Script Scraping Google Map en utilisant Hpricot (Ruby On Rails)

Fondamentalement, je suis en train de ferraille de code:

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

Ceci est juste l'une des pages je vais devoir gratter et donc je ne peux pas nourrir le programme directement le code i besoin = /.

Quand je Grattez la page en utilisant le code suivant (en 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) } 

Je remarque qu'au lieu de la partie du code que je requiers, je ne vois la référence de script, à savoir

<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 (Extensions de cheveux Balmain) à Malte | Pages Jaunes?? (Malte) Ltd | YellowPages.com.mt

C'est aussi ce que je vois quand je regarde la source sur Firefox. Cependant quand je survole les éléments dans Firebug, je peux obtenir un XPath, qui malheureusement ne fonctionne pas à cause de la référence de script restante. (Je ne suis pas sûr si j'explique est correct). J'aurais vraiment besoin de tout le code qui est généré sur la page en raison du script (qui n'est visible que dans firebug). Je besoin de ce afin que je puisse en extraire les éléments suivants (prise de Firebug en plaçant le curseur sur l'icône Google sur la carte:

<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"> 

qui donne la XPath suivante (// désigne un tbody), mais comme je l'ai mentionné, car il ne donne pas tout le code dans hpricot, son assez inutile car il ne peut pas y accéder!

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

de cette manière, je serais en mesure d'extraire le gaz naturel liquéfié et Lat qui i vraiment besoin pour mon projet Je ne sais vraiment pas comment s'y prendre s d'une autre manière en utilisant Hpricot car il ne me donne pas tout le code dont j'ai besoin. Toute aide serait extrêmement appréciable.

Répondre

5

C'était amusant. Cela peut être fait, mais ça va prendre plus de temps. J'ai remarqué tout en reniflant qu'un webservice est appelé pour remplir la latitude et la longitude. Voici ce que vous pouvez faire pour obtenir à cette information:

Grattez le site comme vous le faites normalement, mais recherchez un appel à la fonction LoadMap javascript . La ligne ressemblera à quelque chose comme:

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

Analysez l'ID et appelez le service Web.Cela finira par regarder quelque chose comme:

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 } 

Vous voyez la latitude et la longitude dans la sortie:

35.88805 
14.46627 

Hope this helps. Bonne chance!

+0

vous êtes sérieusement un génie Eric! Merci beaucoup, je ne serais pas arrivé à une solution sans votre aide. Encore merci – Erika

1

Ce type de capture d'écran ne fonctionnera pas car vous essayez de récupérer des éléments ajoutés dynamiquement à la page après l'envoi du HTML de la page au navigateur. Dans ce cas, le navigateur est hpricot, et tout ce qu'il voit est le contenu envoyé par le serveur, plutôt que le contenu après l'exécution du javascript de la page.

La raison pour laquelle Firebug peut voir les éléments que vous essayez de récupérer est que Firebug analyse l'état actuel d'une page dans le navigateur, ce qui inclut la qualité des scripts dynamiques de Google Maps.