simple_html_dom
不适用于某些网站并返回未知代码:
$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
我该怎么做才能解决这个问题?
答案 0 :(得分:1)
这里的根本问题(至少在我的计算机上,可能与你的版本不同......)是该网站返回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();
请注意,此hack不适用于大多数网站。这个问题背后的主要原因似乎是curl并没有宣布它接受gzip数据......但是该域上的Web服务器并不关注那个头,并且无论如何都会对它进行gzip。然后curl和php都没有实际检查响应上的Content-Encoding标头,并假设它没有被gzip压缩,所以它传递它没有错误也没有调用gunzip。这里的服务器和客户端都有错误!
对于更强大的解决方案,也许您可以使用curl获取标头并自行检查它们以确定是否需要对其进行解压缩。或者你可以在这个网站上使用这个hack,以及让其他人保持简单的常用方法。
在输出中设置字符编码可能还有帮助。在回显任何内容之前添加此内容,以确保您读取的数据不被用户浏览器中的数据读取为错误的字符集:
header('Content-Type: text/html; charset=utf-8');