我试图使用 GuzzleHTTP 6 进行网络抓取,到目前为止,我无法在响应正文中找到混乱编码的解决方案。
假设我想解析网页,它以多种不同的语言返回数据。
客户端初始化
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;
问题:
如果文本是英文,响应看起来几乎没问题,除了一些字符被弄乱了
操纵,有
代替
manipulation, there's
如果我试图获取任何其他语言的数据,那就是我得到的(俄语数据)
↓;↓;°; Ð;¿;Ð;µ;Ñ;€Ð;²;Ñ;‹Ð;¹; Ð;²;Ð
代替
На первый взгляд
问题是,如果您查看网站,一切都很好,但如果您尝试抓取它,您将面临这些问题。到目前为止,我无法找到问题的根源,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"
]
}