我正在使用Goutte从 UTF-8 站点上抓取,该站点内部使用 Guzzle。该站点声明了一个 UTF-8 元标记,因此:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
但是,内容类型标头因此是:
Content-Type: text/html
并不是:
Content-Type: text/html; charset=utf-8
因此,当我抓取时,Goutte 没有发现它是 UTF-8,并且错误地抓取了数据。远程站点不在我的控制之下,所以我无法解决那里的问题!这是一组复制问题的脚本。一、刮板:
<?php
require_once realpath(__DIR__ . '/..') . '/vendor/goutte/goutte.phar';
$url = 'http://crawler-tests.local/utf-8.php';
use Goutte\Client;
$client = new Client();
$crawler = $client->request('get', $url);
$text = $crawler->text();
echo 'Whole page: ' . $text . "\n";
现在要放置在 Web 服务器上的测试页面:
<?php
// Correct
#header('Content-Type: text/html; charset=utf-8');
// Incorrect
header('Content-Type: text/html');
?>
<!DOCTYPE html>
<html>
<head>
<title>UTF-8 test</title>
<meta charset="utf-8" />
</head>
<body>
<p>When the Content-Header header is incomplete, the pound sign breaks:
£15,216</p>
</body>
</html>
这是 Goutte 测试的输出:
整页:UTF-8 测试 Content-Header 标头不完整时,井号中断:£15,216
正如您从最后一个脚本中的注释中看到的那样,在标题中正确声明字符集可以解决问题。我在 Goutte 中四处搜寻,看看是否有任何东西看起来会强制使用字符集,但无济于事。有任何想法吗?