0

作成中の Web マッシュアップの情報を抽出するために必要なスクレイピング コードに問題があります。

基本的に、私はコードをスクレイプしようとしています:

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

これは、スクレイピングする必要があるページの 1 つにすぎないため、必要なコードをプログラムに直接供給することはできません =/.

次のコードを使用してページをスクレイプすると (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 を取得できますが、スクリプト参照が残っているため、残念ながら機能しません。(説明が正しいかどうかはわかりません)。スクリプトのためにページ上で生成されるすべてのコードが本当に必要になります (これは 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">

これは次の 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 マップの動的なスクリプト機能が含まれます。

于 2009-11-10T18:05:44.227 に答える