-1

simple_html_dom一部の Web サイトでは機能せず、不明なコードが返されます。

$html = file_get_html('http://www.tsetmc.com/loader.aspx?ParTree=151311&i=49776615757150035');
echo $html;

そして結果は以下のようなものです:

�D�}R��][��ƕ~OU�̇p�����" gK�e[�8+[���)� B3t8䘄F�8�Z[7�ʿ�/rT�'����K~i��/�s��0��h��>���ڷ�7�����8��������(l��Eq������;��V������u�tƝ[ݨ���{qԋ[�kW[Q� j��ĝ���n\�{�ʅ��p�=�����#���??�����I�����s�޾�ۏ;������?<���$xݓV��vo��AxQ|-��6'7oƧ��R|�s�ۀ��ޝn��ӟ�����ǭ^t����߼��|O4�76/�?��Qo���ս��5�at¶�p���� ����-n5�9o6u����Ŀv�Q�v

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

2

ここでの根本的な問題 (少なくとも私のコンピューターでは、バージョンによって異なる可能性があります...) は、サイトが gzip 圧縮されたデータを返し、dom パーサーに渡される前に php と curl によって適切に圧縮解除されていないことです。PHP 5.4 を使用している場合は、gzdecode と file_get_contents を使用して自分で解凍できます。

古いバージョンの php では、次のコードが機能します。

<?php
    // download the site
    $data = file_get_contents("http://www.tsetmc.com/loader.aspx?ParTree=151311&i=49776615757150035");
    // decompress it (a bit hacky to strip off the gzip header)
    $data = gzinflate(substr($data, 10, -8));
    include("simple_html_dom.php");
    // parse and use
    $html = str_get_html($data);
    echo $html->root->innertext();

このハックは、ほとんどのサイトでは機能しないことに注意してください。これの根底にある主な理由は、curlがgzipデータを受け入れることを発表していないように思えます...しかし、そのドメインのWebサーバーはそのヘッダーに注意を払わず、とにかくgzipします。次に、curl も php も実際には応答の Content-Encoding ヘッダーをチェックせず、gzip されていないと想定するため、エラーや gunzip の呼び出しなしで通過します。ここでサーバーとクライアントの両方にバグがあります!

より堅牢なソリューションとして、curl を使用してヘッダーを取得し、それらを自分で調べて、解凍する必要があるかどうかを判断できます。または、このサイトにはこのハックを使用し、他のサイトには通常の方法を使用して物事をシンプルにすることもできます.

出力に文字エンコーディングを設定することも役立つ場合があります。何かをエコーする前にこれを追加して、読み取ったデータが間違った文字セットとして読み取られてユーザーのブラウザーで再破損しないようにします。

header('Content-Type: text/html; charset=utf-8');
于 2013-11-08T23:08:06.747 に答える