2012-01-04 4 views
1

私はPHPをサポートしていないので、私が開発していたプラットフォーム(電話の隙間を通したiOS)がPHPをサポートしていないことを知るまで、私はウェブスクレイピング技術をPHPで手に入れました。私はJSを通して解決策を見つけました。クリックして結果を解析するのではなく、AJAXにURLを読み込みますか?

$(document).ready(function(){ 
    var container = $('#target'); 
    $('.ajaxtrigger').click(function(){ 
    doAjax($(this).attr('href')); 
    return false; 
    }); 
    function doAjax(url){ 
    if(url.match('^http')){ 
     $.getJSON("http://query.yahooapis.com/v1/public/yql?"+ 
       "q=select%20*%20from%20html%20where%20url%3D%22"+ 
       encodeURIComponent(url)+ 
       "%22&format=xml'&callback=?", 
     function(data){ 
      if(data.results[0]){ 
      var data = filterData(data.results[0]); 
      container.html(data); 
      } else { 
      var errormsg = '<p>Error: could not load the page.</p>'; 
      container.html(errormsg); 
      } 
     } 
    ); 
    } else { 
     $('#target').load(url); 
    } 
    } 
    function filterData(data){ 
    data = data.replace(/<?\/body[^>]*>/g,''); 
    data = data.replace(/[\r|\n]+/g,''); 
    data = data.replace(/<--[\S\s]*?-->/g,''); 
    data = data.replace(/<noscript[^>]*>[\S\s]*?<\/noscript>/g,''); 
    data = data.replace(/<script[^>]*>[\S\s]*?<\/script>/g,''); 
    data = data.replace(/<script.*\/>/,''); 
    return data; 
    } 
}); 

URLがロードされている方法は、リンクをクリックすることであり、それはそれのhrefだとurl(少なくとも私は思う)を移入します。私は、http://website.comのような静的なURLを事前に設定しておきたいです。私はすべてdoAjax(url)doAjax('http://website.com)に置き換えようとしましたが、それはうまくいかないと思います。私が間違っていることを知りたいのですが。

新しいJSスクリプトのもう1つの問題は、結果を解析してtable要素のみを表示できるようにすることです。 PHPで、私はこれを使ってこれを行いました:

data = $html->find('table'); 
echo $data[1]; 

PHP関数のjavascriptには何が相当しますか?

サイドノートでは、私は2つのポストにこれを分割検討していたが、私はそれが今夜のためにあまりにも多くの記事:)

編集だろうと思った。まず問題はコメントで@nnnnnnにより解決しました。最初の部分については

+1

上記のコードはリンクがクリックされたときに(doAjax()関数を呼び出すクリックハンドラを介して)動作しますが、自動的に ''http://website.com 'をクリックするだけで、doAjax(' http://website.com ');をdocument.ready関数の最後に追加するだけです。ちなみに、JSONPの "webscraping"の使い方は? – nnnnnn

+0

ありがとう、それは最初の問題を解決します。そして、私はそれをPHPとJSの間で行っているので、私はそれをgoogledと言います。より適切な名前があるかどうかはわかりませんでした。 – Charlie

答えて

1

:第二部トライため

function doAjax(url) { 
    url = url || 'http://website.com'; // fallback to str if url isnt defined 

    // ... rest of your code 
} 

(この生のHTMLがどこにあるかdata.results[0]があると仮定し)上記のコードはリンクがクリックされたときに(doAjax()関数を呼び出すクリックハンドラ経由で)機能しますが、'http://website.com'をクリックしなくても自動的に呼び出したい場合は、doAjax('http://website.com');をdの最後に追加しますocument.ready関数。

限り応答からだけで特定のテーブルを抽出するなど、あなたのAJAXコールバック関数内で使用すると、返されたデータからjQueryオブジェクトを作成し、追加するためにあなたが気に一部、および.append()を抽出するためにjQueryの.find()メソッドを使用することができますあなたのコンテナ要素にその一部:.find()ためのセレクタは、特にあなたが話しているテーブルを選択するために、より多くの情報が必要な場合がありますことを

function(data){ 
    if(data.results[0]){ 
     var fullResponse = $(filterData(data.results[0])), 
      justTable = fullResponse.find("table"); 
     container.append(justTable); 
    } else { 
     var errormsg = '<p>Error: could not load the page.</p>'; 
     container.html(errormsg); 
    } 
    } 

注意。 "table:first"がそれを行うかどうか、またはそのテーブルにid属性がある場合は、代わりに.find("#thetableidhere")、または...?

+0

これは素晴らしい作品です。質問すると、読み込まれていない画像に対して404の結果が多く表示されます。これらのエラーを取り除くためにとにかくありますか? – Charlie

1

この試してください:あなたが言っている場合

$(data.results[0]).find('table'); // may have to use .filter() if node is in root 
+0

「nnnnnn」のコメントで最初の問題を解決しました。 2番目の解決策については、どこに置くのですか? – Charlie

+0

'$ .getJSONP()'コールバック関数の 'filterData()'の後に – nav

+0

をjsFiddleに配置しました。それは正しい場所ですか? http:// jsfiddle。net/5Mgur/ – Charlie

関連する問題