0

我在抓取代码时遇到问题,我需要为我正在创建的 Web MashUp 提取信息。

基本上,我正在尝试从以下位置抓取代码:

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

这也是我在 Firefox 上查看源代码时看到的。但是,当我将鼠标悬停在 Firebug 中的元素上时,我能够获得一个 XPath,但不幸的是,由于脚本引用仍然如此,它无法正常工作。(我不确定我的解释是否正确)。由于脚本(目前只能在萤火虫中查看),我真的需要页面上生成的所有代码。我需要这个,以便我可以提取以下内容(通过将鼠标悬停在地图上的 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 以另一种方式解决这个问题,因为它没有给我我需要的所有代码。任何帮助将不胜感激。

4

2 回答 2

5

这是一个有趣的。它可以做到,但它需要更多的 hpricot。我在嗅探时注意到正在调用 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

希望这可以帮助。祝你好运!

于 2009-11-10T19:48:35.587 回答
1

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

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

于 2009-11-10T18:05:44.227 回答