我试图使用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;
问题:
如果文字是英文的,那么回复看起来几乎没有,除了一些字符搞砸了
操纵,那就是
而不是
manipulation, there's
如果我想用其他任何语言获取数据,那就是我得到的数据(俄语数据)
d; d;°; d;¿; d;μ; N;€d;²; N;
而不是
На первый взгляд
问题是,如果你查看网站,它一切都很好,但如果你试图抓住它,你将面临这些问题。
到目前为止,我无法找到问题的根源,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"
]
}
答案 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%。