0

私はこれを作りました:

<html>
    <head>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
        <script>
            $(document).ready(
                function()
                {   
                    $("body").html($("#HomePageTabs_cont_3").html());
                }
            );
        </script>
    </head>
    <body>
    <?php
        echo file_get_contents("http://www.bankasya.com.tr/index.jsp");
    ?>

    </body>
</html>

ページを Firebug でチェックすると、数え切れないほどの「欠落ファイル」(画像、css ファイル、js ファイルなど) のエラーが表示されます。ページ全体ではなく、一部だけを表示したい。このコードは、私が望むことを行います。しかし、もっと良い方法があるかどうか疑問に思っています。

編集:

ページは私が必要とすることを行います。すべてのコンテンツは必要ありません。だからiframe私には役に立たない。div の生データが欲しいだけです#HomePageTabs_cont_3

4

3 に答える 3

4

あなたの最善の策は、PHP サーバー側の解析です。を使用してこれを行う方法を示す小さなスニペットを作成しましたDOMDocument(tidyサーバーにそれがある場合は、不正な形式の XHTML foo をすべて削除するため)。

警告: UTF-8 を出力します。これは、DOMDocument のコンストラクターで変更できます。

警告 2 :入力が utf-8 でも iso-8859-9 でもない場合、barf アウトします現在のページの文字セットは iso-8859-9 であり、これを変更する理由がわかりません。

header("content-type: text/html; charset=utf-8");
$data = file_get_contents("http://www.bankasya.com.tr/index.jsp");
// Clean it up
if (class_exists("tidy")) {
   $dataTidy = new tidy();
   $dataTidy->parseString($data,
                                 array(
                                       "input-encoding" => "iso-8859-9",
                                       "output-encoding" => "iso-8859-9",
                                       "clean" => 1,
                                       "input-xml" => true,
                                       "output-xml" => true,
                                       "wrap" => 0,
                                       "anchor-as-name" => false
                                 )
                          );
   $dataTidy->cleanRepair();
   $data = (string)$dataTidy;
}
else {
    $do = true;
            while ($do) {
                    $start = stripos($data,'<script');
                    $stop = stripos($data,'</script>');
                    if ((is_numeric($start))&&(is_numeric($stop))) {
                            $s = substr($data,$start,$stop-$start);
                            $data = substr($data,0,$start).substr($data,($stop+strlen('</script>')));
                    } else {
                            $do = false;
                    }
            }
    // nbsp breaks it?
    $data = str_replace("&nbsp;"," ",$data);
    // Fixes for any element that requires a self-closing tag
    if (preg_match_all("/<(link|img)([^>]+)>/is",$data,$mt,PREG_SET_ORDER)) {
            foreach ($mt as $v) {
                    if (substr($v[2],-1) != "/") {
                            $data = str_replace($v[0],"<".$v[1].$v[2]."/>",$data);
                    }
            }
    }
    // Barf out the inline JS
    $data = preg_replace("/javascript:[^;]+/is","#",$data);
    // Barf out the noscripts
    $data = preg_replace("#<noscript>(.+?)</noscript>#is","",$data);
    // Muppets. Malformed comment = one more regexp when they could just learn to write proper HTML...
    $data = preg_replace("#<!--(.*?)--!?>#is","",$data);
}
$DOM = new \DOMDocument("1.0","utf-8");
$DOM->recover = true;
    function error_callback_xmlfunction($errno, $errstr) { throw new Exception($errstr); }
    $old = set_error_handler("error_callback_xmlfunction");
// Throw out all the XML namespaces (if any)
$data = preg_replace("#xmlns=[\"\']?([^\"\']+)[\"\']?#is","",(string)$data);
try {
      $DOM->loadXML(((substr($data, 0, 5) !== "<?xml") ? '<?xml version="1.0" encoding="utf-8"?>' : "").$data);
} catch (Exception $e) {
      $DOM->loadXML(((substr($data, 0, 5) !== "<?xml") ? '<?xml version="1.0" encoding="iso-8859-9"?>' : "").$data);
}
    restore_error_handler();
error_reporting(E_ALL);
$DOM->substituteEntities = true;
$xpath = new \DOMXPath($DOM);
echo $DOM->saveXML($xpath->query("//div[@id=\"HomePageTabs_cont_3\"]")->item(0));

登場順:

  • データを取得する
  • がある場合はtidy、それで HTML をサニタイズします
  • 新しいドキュメントを作成し、DOMDocumentドキュメントをロードします ((string)$dataTidyは簡単な tidy getter です)。
  • XPath リクエスト パスを作成する
  • XPath を使用して、必要に応じて id が設定されたすべての div を要求し、コレクションの最初の項目 ( ->item(0)、これは になりますDOMElement) を取得し、DOM がその XML コンテンツ (タグ自体を含む) を出力するように要求します。

それがあなたが探しているものであることを願っています...関数でラップしたいかもしれませんが。

編集

言及するのを忘れていました:実際のスクリプト出力についてはhttp://rescrape.it/rs.phpを参照してください!

編集 2

訂正、そのサイトは W3C で有効ではないため、tidy処理する前にサイトを作成するか、一連の正規表現を入力に適用する必要があります。矛盾を解消するためのセットを策定できるかどうかを確認します。

編集 3

を持っていない私たち全員のための修正を追加しましたtidy

編集 4

抵抗できませんでした。テーブルではなく値が実際に必要な場合は、エコーの代わりにこれを使用します。

 $d = new stdClass();
 $rows = $xpath->query("//div[@id=\"HomePageTabs_cont_3\"]//tr");
 $rc = $rows->length;
 for ($i = 1; $i < $rc-1; $i++) {
     $cols = $xpath->query($rows->item($i)->getNodePath()."/td");
     $d->{$cols->item(0)->textContent} = array(
        ((float)$cols->item(1)->textContent),
        ((float)$cols->item(2)->textContent)
     );
 }

あなたのことはわかりませんが、私にとっては、不正な形式のテーブルよりもデータの方がうまく機能します。

(うーん、それは書くのに時間がかかりました)

于 2013-04-22T10:15:31.917 に答える
0

私はリモート サイトの所有者に連絡を取り、必要なコンテンツを返すだけのデータ フィードがあるかどうかを尋ねました。

于 2013-04-22T10:17:36.390 に答える