GuzzleHTTP编码问题

时间:2016-06-08 00:47:31

标签: php web-scraping guzzle6

我试图使用GuzzleHTTP 6进行网页报废,到目前为止,我无法在响应体中找到messedup编码的解决方案。

假设我想解析网页,该网页以多种不同的语言重新编辑数据。

客户初始化

public function __construct() {
    $this->dataClient = new Client(['base_uri' => 'http://somewebsite.org/{language_code}']);
}

使用数据客户端

$request = $this->dataClient->get('/endpoint/' . $data_query . '/');
$response = $request->getBody()->__toString();
$decoded = json_decode($response, true);
foreach ($decoded as $index => $data) {
    $decoded[$index] = str_replace(['<option', '>', '</option>'], '', $data);
}
return $decoded;

问题:

  1. 如果文字是英文的,那么回复看起来几乎没有,除了一些字符搞砸了

    操纵,那就是

  2. 而不是

    manipulation, there's
    
    1. 如果我想用其他任何语言获取数据,那就是我得到的数据(俄语数据)

      d; d;°; d;¿; d;μ; N;€d;²; N;

    2. 而不是

      На первый взгляд
      

      问题是,如果你查看网站,它一切都很好,但如果你试图抓住它,你将面临这些问题。 到目前为止,我无法找到问题的根源,utf8_decode或iconv都没有帮助我解决问题。
      任何解决方案都非常受欢迎!

      所以,这是一个小更新 这是解析函数:

      public function processData($data_query) {
          $request = $this->dataClient->get('/endpoint/' . $data_query . '/');
          $response = $request->getBody()->__toString();
          // echo $response; - Everything is fine, no encoding problems
          // return $response; - Encoding problems
          $decoded = json_decode($response, true);
          // return $decoded; - Encoding problems
          foreach ($decoded as $index => $data) {
              $decoded[$index] = str_replace(['<option', '>', '</option>'], '', $data);
          }
          return $decoded; - Encoding Problems
      }
      

      原始回复标题

      {
          Date: [
              "Wed, 08 Jun 2016 01:45:30 GMT"
          ],
          Server: [
              "Apache"
          ],
          X-Frame-Options: [
              "SAMEORIGIN"
          ],
          Retry-After: [
              "600"
          ],
          Content-Language: [
              "en-GB"
          ],
          Vary: [
              "Accept-Encoding"
          ],
          Transfer-Encoding: [
              "chunked"
          ],
          Content-Type: [
              "text/html;charset=UTF-8"
          ]
      }
      

2 个答案:

答案 0 :(得分:1)

我有类似的情况(使用Guzzle加载XML并使用SimpleXML解析),但我知道源代码是在ISO-8559-1中,但SimpleXML解析结果的输出是乱码的。我尝试了很多方法,只有这个解决了_:

$attribute = mb_convert_encoding((string) $attribute, 'ISO-8859-1', 'UTF-8');

该属性是一些XML节点值。我只是将已知编码转换为我想要的编码。希望可以帮助一些人......

答案 1 :(得分:0)

阅读此处发布的旧版SO响应:Can Goutte/Guzzle be forced into UTF-8 mode?。是的,它提到了使用utf8_decode(),但也提到了一个Guzzle的分支。看看Guzzle的问题跟踪器,它有一个听起来与你的相似的问题吗?如果是这样,请对其进行评论,以确定核心开发人员是否会修复它。上述SO帖子已有3年历史,如果问题如此普遍,如果仍需要黑客和叉子,我会感到惊讶。

也许已修复,您现在需要确保已抓取的网页本身正在发送正确的编码标头。请注意,响应标头有一个优先顺序。我相信它是最重要的网络服务器,然后是DOM本身,如果这些标题没有从网络服务器的响应中发送或省略。但请检查一下,因为我不是100%。