首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以用Goutte解析JSON吗?

可以用Goutte解析JSON吗?
EN

Stack Overflow用户
提问于 2013-09-10 15:07:28
回答 4查看 6.3K关注 0票数 4

我正在抓取网站,到目前为止,用Goutte解析HTML没有问题。但是我需要从网站上检索JSON,由于cookie管理,我不想用file_get_contents()来实现它--这是行不通的。

我可以使用纯cURL,但在这种情况下,我只想使用Goutte,而不想使用任何其他库。

那么,有什么方法我只能通过Goutte解析文本,还是真的必须用好的旧方法来解析呢?

代码语言:javascript
复制
/* Sample Code */
$client = new Client();
$crawler = $client->request('foo');
$crawler = $crawler->filter('bar'); // of course not working

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-11 12:52:41

在Goutte库中进行了非常深入的搜索之后,我找到了一种方法,并想要分享。因为Goutte是一个非常强大的库,但是有如此复杂的文档。

通过(Goutte >)解析JSON

只需获取所需的输出页面并将json存储到数组中即可。

代码语言:javascript
复制
$client = new Client(); // Goutte Client
$request = $client->getClient()->createRequest('GET', 'http://***.json');   
/* getClient() for taking Guzzle Client */

$response = $request->send(); // Send created request to server
$data = $response->json(); // Returns PHP Array

通过(Goutte + Guzzle)解析JSON和Cookies -用于身份验证

发送请求站点的一个页面(主页看起来更好)以获得cookie,然后使用这些cookie进行身份验证。

代码语言:javascript
复制
$client = new Client(); // Goutte Client
$crawler = $client->request("GET", "http://foo.bar");
/* Send request directly and get whole data. It includes cookies from server and 
it automatically stored in Goutte Client object */

$request = $client->getClient()->createRequest('GET', 'http://foo.bar/baz.json');
/* getClient() for taking Guzzle Client */

$cookies = $client->getRequest()->getCookies();
foreach ($cookies as $key => $value) {
   $request->addCookie($key, $value);
}

/* Get cookies from Goutte Client and add to cookies in Guzzle request */

$response = $request->send(); // Send created request to server
$data = $response->json(); // Returns PHP Array

希望能帮上忙。因为我几乎花了3天时间来理解Gouttle和它的组成部分。

票数 16
EN

Stack Overflow用户

发布于 2015-03-31 00:52:32

经过几个小时的搜索,我发现了这一点,只需这样做:

代码语言:javascript
复制
$client = new Client(); // Goutte Client
$crawler = $client->request("GET", "http://foo.bar");

$jsonData = $crawler->text();
票数 3
EN

Stack Overflow用户

发布于 2014-09-19 20:52:46

的解决方案对我没有用。我创建了一个新类"BetterClient":

代码语言:javascript
复制
use Goutte\Client as GoutteClient;

class BetterClient extends GoutteClient
{
    private $guzzleResponse;

    public function getGuzzleResponse() {
        return $this->guzzleResponse;
    }

    protected function createResponse($response)
    {
        $this->guzzleResponse = $response;
        return parent::createResponse($response);
    }
}

用法:

代码语言:javascript
复制
$client = new BetterClient();
$request = $client->request('GET', $url);
$data = $client->getGuzzleResponse()->json();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18722528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档