【问题标题】:why file_get_contents returning strange characters?为什么 file_get_contents 返回奇怪的字符?
【发布时间】:2012-09-28 05:34:31
【问题描述】:

我正在尝试使用 file_get_contents 解析 http://www.desi-tashan.com/category/pakistan-tvs/aaj-tv/3-idiots/

但它会返回非常不寻常的字符和符号。

好像我解析 http://www.desi-tashan.com/ 它工作得很好。有人能说出为什么会这样吗?

是否涉及任何编码解码?

页面好像是用wordpress做的..

【问题讨论】:

  • 我在谷歌上找到了这个(oooff.com/php-scripts/basic-php-scraped-data-parsing/…),它可能会有所帮助
  • 该页面没有提供太多关于编码或 wordpress 相关的解析...
  • 符号可能是二进制图像
  • 当我看不到 html 代码时如何抓取或解析链接?有什么技巧吗?

标签: php parsing


【解决方案1】:

你看到的内容是gzipped

您可能有兴趣查看gzdecodezlib-decode (请注意默认情况下未启用 PHP 中的 Zlib 支持)

您的代码可能如下所示

$url = 'http://www.desi-tashan.com/category/pakistan-tvs/aaj-tv/3-idiots/';
$content = file_get_contents($url);
$decoded_content = gzdecode($content); // or zlib_decode($content);

stackoverflow 上的另一个解决方案 here,它在请求中添加 HTTP 标头 Accept-Encoding,告诉服务器不要 gzip。

但是,它在www.desi-tashan.com 上不起作用,服务器忽略了Accept-Encoding 标头,并且总是返回压缩后的内容

【讨论】:

    【解决方案2】:

    我已经看到这种情况发生在 Web 服务器配置错误并发送回压缩页面的网站上,无论客户端是否表示它可以处理这种情况。 (客户端使用Accept-Encoding 标头表示这一点,file_get_contents 不会发送该标头。)这通常适用于 Web 浏览器,因为它们要么请求默认压缩的页面,要么处理压缩响应,即使它们没有求一个。

    (顺便说一句,如果在 unix 派生系统上,您可以通过将其保存到文件然后在其上运行 file 来轻松确认返回的内容是 gzip 压缩的。或者只查看前几个字节结果自己——gzip 数据以 1F 8B 开头。)

    与其手动解压缩内容,不如亲自使用 PHP 的 curl 库。您可以将其配置为请求压缩后的内容,如果这样做,它将透明地为您解压缩结果:

    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, 'http://actualidad.rt.com/actualidad');
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_ENCODING , 'gzip');
    $content = curl_exec ($ch);
    

    这比手动解码结果更具前瞻性,就好像网络服务器在未来被正确配置为将纯文本发送回无法处理 gzip 的客户端一样,此代码仍将请求并解码压缩版本.

    【讨论】:

    • 这对于不支持gzdecode的主机来说是更好的解决方案
    【解决方案3】:

    您可以简单地使用javascript charAt method 来获取特定位置的字符串字符。 或者 很清楚,只需为函数提供一个文件名,它就会返回您选择的文件的扩展名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 2017-07-04
      • 2018-03-11
      • 2019-07-27
      相关资源
      最近更新 更多