【问题标题】:simple_html_dom doesn't work for some sitessimple_html_dom 不适用于某些网站
【发布时间】:2013-11-08 23:03:39
【问题描述】:

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

我可以做些什么来解决这个问题?

【问题讨论】:

标签: php dom simple-html-dom


【解决方案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。服务端和客户端的bug都在这里!

对于更健壮的解决方案,也许您可​​以使用 curl 获取标头并自己检查它们以确定是否需要对其进行解压缩。或者,您可以在此站点上使用此 hack,并为其他人使用常规方法以使事情变得简单。

在您的输出中设置字符编码也可能会有所帮助。在回显任何内容之前添加此内容,以确保您读取的数据不会因为被读取为错误的字符集而在用户浏览器中被重新损坏:

header('Content-Type: text/html; charset=utf-8');

【讨论】:

  • 使用与您的问题相同的网址还是不同的网址?
  • 使用相同的网址
  • 我找到了根本问题:实际上是 file_get_contents 没有压缩数据。所以它试图将压缩数据解析为 html 并且作为垃圾出现。 php 5.4 内置了 gzip 解码功能,但之前的版本没有....
  • 非常感谢。还有另一个问题...此代码不显示此网址的来源它显示主页网址..在下面您可以看到代码获取的源...但它不是目标页面源...我们调用获取来源:tsetmc.com/loader.aspx?ParTree=151311&i=49776615757150035 并接收类似代码:tsetmc.com/Loader.aspx?ParTree=15131F 有什么问题:(?
  • 例如类“box1 red tbl zi1_4 h110”不在使用php获取源代码中......但它存在于原始页面中:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
相关资源
最近更新 更多