【问题标题】:Using PHP cURL to downloading URL with special characters使用 PHP cURL 下载带有特殊字符的 URL
【发布时间】:2017-06-30 07:56:24
【问题描述】:

我正在尝试使用 PHP cURL 下载以下 URL https://www.astegiudiziarie.it/vendita-asta-appartamento-genova-via-san-giovanni-d’acri-14-1360824

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.astegiudiziarie.it/vendita-asta-appartamento-genova-via-san-giovanni-d’acri-14-1360824');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$f = curl_exec($ch);
curl_close($ch);
echo $f;

但是服务器总是返回一个错误页面。在 Web 浏览器中导航相同的 URL 可以正常工作。手动将curl_exec 返回的 HTML 源代码与 Web 浏览器中的 HTML 源代码进行比较,差异立即显而易见。

我尝试utf8_decode() URL 没有成功。

我不能简单地包装网址 在urlencode() 中,因为它甚至可以对普通字符进行编码,例如:/

这些 URL 是通过编程方式检索(抓取)的,并且并不总是具有相同的结构,因此很难将它们拆分并仅对某些部分进行 urlencode。

顺便说一句,现代网络浏览器似乎很好地处理了这种情况。 PHP中有解决方案吗?

【问题讨论】:

    标签: php curl unicode web-scraping


    【解决方案1】:

    您的网址已编码。不要在其上调用urlencode(),因为这是您得到 404 的原因,因为服务器只解码一次。只需删除呼叫。

    【讨论】:

      【解决方案2】:

      解析 URL 组件,然后对其进行编码。

      我们的想法是仅在 URL 的路径和查询部分使用urlencode(),不理会初始段。我相信这就是浏览器在幕后所做的事情。

      您可以使用parse_url() 将 URL 拆分为其组件,转义您需要的部分(最有可能是路径和查询)并重新组合它。甚至有人在parse_url()documentation page上发布了一个重新组装cmet中的URL的功能。

      【讨论】:

      • 有点hackish,将URL分成几部分,分别编码它们会起作用。我只是想知道是否有更漂亮的方法来做到这一点。
      【解决方案3】:

      也许

      $urli=parse_url('https://www.astegiudiziarie.it/vendita-asta-appartamento-genova-via-san-giovanni-d’acri-14-1360824');
      $url=urli['scheme'].'://'.$urli['host'].'/'.urlencode(ltrim('/',$urli['path'])).'?'.$urli['query'];
      

      【讨论】:

      • 有点hackish,将URL分成几部分,分别编码它们会起作用。我只是想知道是否有更漂亮的方法来做到这一点。
      【解决方案4】:

      我终于得到了:

      function urlencode_parts($url) {
          $parts = parse_url($url);
          $parts['path'] = implode('/', array_map('urlencode', explode('/', $parts['path'])));
          $url = new \http\Url($parts);
          return $url->toString();
      }
      

      使用包\http\Url,在最新的PHP版本中替换http_build_url函数。

      似乎file_get_contents 不适用于特殊字符。

      2018-05-09 更新:在 cUrl 7.52.1 中似乎已修复

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-15
        • 2011-04-23
        • 1970-01-01
        • 2012-01-30
        • 2020-06-11
        • 1970-01-01
        • 1970-01-01
        • 2014-10-28
        相关资源
        最近更新 更多