Guzzle 和 DomCrawler
Guzzle and DomCrawler
我正在使用 Guzzle 和 DomCrawler 从网页中抓取数据,除一个问题外一切正常。它在我抓取的数据中插入了奇怪的字符。这是一个例子:
[2]=>
array(4) {
["cell_lines"]=>
string(4) "A549"
["cancer"]=>
string(4) "Lung"
["ic50"]=>
string(7) ">40 ┬ÁM"
["pmid"]=>
string(8) "10380632"
}
[3]=>
array(4) {
["cell_lines"]=>
string(16) "B16 melanoma 4A5"
["cancer"]=>
string(4) "Skin"
["ic50"]=>
string(7) ">40 ┬ÁM"
["pmid"]=>
string(8) "10380632"
}
[4]=>
array(4) {
["cell_lines"]=>
string(9) "TGBC11TKB"
["cancer"]=>
string(7) "Stomach"
["ic50"]=>
string(7) ">40 ┬ÁM"
["pmid"]=>
string(8) "10380632"
}
价值>40 ┬ÁM
应该存在的值是 >40 µM
但这不仅仅是希腊字母,这是另一个例子:
["properties"]=>
array(6) {
["logp"]=>
string(5) "á2.85"
["vdw_volume"]=>
string(8) " 239.67"
["polar_surface_area"]=>
string(7) " 75.99"
["refractivity"]=>
string(8) " 363.43"
["mass"]=>
string(9) " 284.068"
["formula"]=>
string(10) " C16H12O5"
据我所知,这些数值前只有
个间隔符。它出于某种原因将所有内容都转换为 ┬á 。如果我将所有内容都包装在 utf8_decode($crawler->text())
这是我得到的:
["properties"]=>
array(6) {
["logp"]=>
string(5) "?2.85"
["vdw_volume"]=>
string(7) "á239.67"
["polar_surface_area"]=>
string(6) "á75.99"
["refractivity"]=>
string(7) "á363.43"
["mass"]=>
string(8) "á284.068"
["formula"]=>
string(9) "áC16H12O5"
所以所有的变化是我得到 á
而不是 ┬Á
我试过像这样创建 Crawler 实例:
$crawler = new Crawler('','http://crdd.osdd.net/raghava/npact/');
$crawler->addHTMLContent($raw, 'UTF-8');
它没有任何改变。我尝试将此 header 添加到文件顶部:
header('Content-Type: text/html; charset=utf8;');
没有效果。
这是我打开 Guzzle 客户端的方式:
$client = new Client(array(
'base_uri' => 'http://crdd.osdd.net/'
));
$response = $client->request('GET','raghava/npact/brws_alp.php?b=A');
https://gist.github.com/pschultz/6554265#file-forcecharsetplugin-php
我尝试安装我在此处找到的 ForceChartSet 插件:
并像这样实现它:
// create http client instance
$client = new Client(array(
'base_uri' => 'http://crdd.osdd.net'
));
$plugin = new ForceCharsetPlugin();
$plugin->setForcedCharset('utf8');
// Guzzle only
$client->addSubscriber($plugin);
我得到这个错误:
Fatal error: Uncaught exception 'InvalidArgumentException' with message 'URI must be a string or UriInterface' in
C:\wamp64\www\spider\osdd\vendor\guzzlehttp\psr7\src\functions.php:62
Stack trace:
0 C:\wamp64\www\spider\osdd\vendor\guzzlehttp\guzzle\src\Client.php(142):
GuzzleHttp\Psr7\uri_for(Object(ForceCharsetPlugin))
1 C:\wamp64\www\spider\osdd\vendor\guzzlehttp\guzzle\src\Client.php(115):
GuzzleHttp\Client->buildUri(Object(ForceCharsetPlugin), 数组)
2 C:\wamp64\www\spider\osdd\vendor\guzzlehttp\guzzle\src\Client.php(129):
GuzzleHttp\Client->requestAsync('addSubscriber',
Object(ForceCharsetPlugin), 数组)
3 C:\wamp64\www\spider\osdd\vendor\guzzlehttp\guzzle\src\Client.php(87):
GuzzleHttp\Client->请求('addSubscriber',
Object(ForceCharsetPlugin), 数组)
4 C:\wamp64\www\spider\osdd\osdd_data.php(185): GuzzleHttp\Client->__call('addSubscriber', 数组)
5 C:\wamp64\www\spider\osdd\osdd_data.php(185): GuzzleHttp\Client->addSubscriber(Object(ForceCharsetPlugin))
6 {main} 抛出在 C:\wamp64\www\spider\osdd\vendor\guzzlehttp\psr7\src\functions.php on
第 62 行
有谁知道这里发生了什么,为什么 Guzzle/DomCrawler 将东西转换成这些奇怪的字符?
顺便说一句:这是我的 composer.json
文件,我正在自动加载它以包含以下组件:
{
"require": {
"symfony/dom-crawler": "~3.0",
"symfony/css-selector": "~3.0",
"guzzlehttp/guzzle": "~6.2.2",
"fabpot/goutte": "*",
"symfony/process": "*",
"symfony/var-dump": "*"
}
}
我想知道 ForceCharsetPlugin
不起作用的原因是否可能是因为我包含了它使用的某些组件的一些旧版本。我还没有完全弄清楚版本是如何工作的,我不知道 * 通配符的作用。
抱歉,我发现此问题仅在通过 CLI 运行 脚本时出现。当我在浏览器中打开它时,编码没问题:
https://i.gyazo.com/f488c8a3cbe25cae5c1b368b992b1c53.png
我正在使用 Guzzle 和 DomCrawler 从网页中抓取数据,除一个问题外一切正常。它在我抓取的数据中插入了奇怪的字符。这是一个例子:
[2]=>
array(4) {
["cell_lines"]=>
string(4) "A549"
["cancer"]=>
string(4) "Lung"
["ic50"]=>
string(7) ">40 ┬ÁM"
["pmid"]=>
string(8) "10380632"
}
[3]=>
array(4) {
["cell_lines"]=>
string(16) "B16 melanoma 4A5"
["cancer"]=>
string(4) "Skin"
["ic50"]=>
string(7) ">40 ┬ÁM"
["pmid"]=>
string(8) "10380632"
}
[4]=>
array(4) {
["cell_lines"]=>
string(9) "TGBC11TKB"
["cancer"]=>
string(7) "Stomach"
["ic50"]=>
string(7) ">40 ┬ÁM"
["pmid"]=>
string(8) "10380632"
}
价值>40 ┬ÁM
应该存在的值是 >40 µM
但这不仅仅是希腊字母,这是另一个例子:
["properties"]=>
array(6) {
["logp"]=>
string(5) "á2.85"
["vdw_volume"]=>
string(8) " 239.67"
["polar_surface_area"]=>
string(7) " 75.99"
["refractivity"]=>
string(8) " 363.43"
["mass"]=>
string(9) " 284.068"
["formula"]=>
string(10) " C16H12O5"
据我所知,这些数值前只有
个间隔符。它出于某种原因将所有内容都转换为 ┬á 。如果我将所有内容都包装在 utf8_decode($crawler->text())
这是我得到的:
["properties"]=> array(6) { ["logp"]=> string(5) "?2.85" ["vdw_volume"]=> string(7) "á239.67" ["polar_surface_area"]=> string(6) "á75.99" ["refractivity"]=> string(7) "á363.43" ["mass"]=> string(8) "á284.068" ["formula"]=> string(9) "áC16H12O5"
所以所有的变化是我得到 á
而不是 ┬Á
我试过像这样创建 Crawler 实例:
$crawler = new Crawler('','http://crdd.osdd.net/raghava/npact/');
$crawler->addHTMLContent($raw, 'UTF-8');
它没有任何改变。我尝试将此 header 添加到文件顶部:
header('Content-Type: text/html; charset=utf8;');
没有效果。
这是我打开 Guzzle 客户端的方式:
$client = new Client(array(
'base_uri' => 'http://crdd.osdd.net/'
));
$response = $client->request('GET','raghava/npact/brws_alp.php?b=A');
https://gist.github.com/pschultz/6554265#file-forcecharsetplugin-php
我尝试安装我在此处找到的 ForceChartSet 插件:
并像这样实现它:
// create http client instance
$client = new Client(array(
'base_uri' => 'http://crdd.osdd.net'
));
$plugin = new ForceCharsetPlugin();
$plugin->setForcedCharset('utf8');
// Guzzle only
$client->addSubscriber($plugin);
我得到这个错误:
Fatal error: Uncaught exception 'InvalidArgumentException' with message 'URI must be a string or UriInterface' in C:\wamp64\www\spider\osdd\vendor\guzzlehttp\psr7\src\functions.php:62 Stack trace:
0 C:\wamp64\www\spider\osdd\vendor\guzzlehttp\guzzle\src\Client.php(142):
GuzzleHttp\Psr7\uri_for(Object(ForceCharsetPlugin))
1 C:\wamp64\www\spider\osdd\vendor\guzzlehttp\guzzle\src\Client.php(115):
GuzzleHttp\Client->buildUri(Object(ForceCharsetPlugin), 数组)
2 C:\wamp64\www\spider\osdd\vendor\guzzlehttp\guzzle\src\Client.php(129):
GuzzleHttp\Client->requestAsync('addSubscriber', Object(ForceCharsetPlugin), 数组)
3 C:\wamp64\www\spider\osdd\vendor\guzzlehttp\guzzle\src\Client.php(87):
GuzzleHttp\Client->请求('addSubscriber', Object(ForceCharsetPlugin), 数组)
4 C:\wamp64\www\spider\osdd\osdd_data.php(185): GuzzleHttp\Client->__call('addSubscriber', 数组)
5 C:\wamp64\www\spider\osdd\osdd_data.php(185): GuzzleHttp\Client->addSubscriber(Object(ForceCharsetPlugin))
6 {main} 抛出在 C:\wamp64\www\spider\osdd\vendor\guzzlehttp\psr7\src\functions.php on
第 62 行
有谁知道这里发生了什么,为什么 Guzzle/DomCrawler 将东西转换成这些奇怪的字符?
顺便说一句:这是我的 composer.json
文件,我正在自动加载它以包含以下组件:
{
"require": {
"symfony/dom-crawler": "~3.0",
"symfony/css-selector": "~3.0",
"guzzlehttp/guzzle": "~6.2.2",
"fabpot/goutte": "*",
"symfony/process": "*",
"symfony/var-dump": "*"
}
}
我想知道 ForceCharsetPlugin
不起作用的原因是否可能是因为我包含了它使用的某些组件的一些旧版本。我还没有完全弄清楚版本是如何工作的,我不知道 * 通配符的作用。
抱歉,我发现此问题仅在通过 CLI 运行 脚本时出现。当我在浏览器中打开它时,编码没问题: https://i.gyazo.com/f488c8a3cbe25cae5c1b368b992b1c53.png