Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Erro ao retornar os dados do site Alura

Olá, segui os passos do instrutor mas na hora de buscar os dados do site aparece o seguinte erro:

C:\Users\Usuario\Desktop\Alura\PHP-Composer\buscador-cursos-alura>php buscar-cursos.php
PHP Notice:  Undefined property: Symfony\Component\DomCrawler\Crawler::$filter in C:\Users\Usuario\Desktop\Alura\PHP-Composer\buscador-cursos-alura\buscar-cursos.php on line 20

Notice: Undefined property: Symfony\Component\DomCrawler\Crawler::$filter in C:\Users\Usuario\Desktop\Alura\PHP-Composer\buscador-cursos-alura\buscar-cursos.php on line 20
PHP Warning:  Invalid argument supplied for foreach() in C:\Users\Usuario\Desktop\Alura\PHP-Composer\buscador-cursos-alura\buscar-cursos.php on line 22

Warning: Invalid argument supplied for foreach() in C:\Users\Usuario\Desktop\Alura\PHP-Composer\buscador-cursos-alura\buscar-cursos.php on line 22

Segue o meu código: buscar-cursos.php

<?php

require_once 'vendor/autoload.php';

use GuzzleHttp\Client;
use Symfony\Component\DomCrawler\Crawler;

$client = new Client();
$resposta = $client->request('GET', 'https://www.alura.com.br/formacao-desenvolvedor-php');

//echo $resposta->getStatusCode().PHP_EOL;
//echo $resposta->getHeader('content-type')[0].PHP_EOL;
//echo $resposta->getBody().PHP_EOL;

$html = $resposta->getBody();

$crawler = new Crawler();
$crawler->addHtmlContent($html);

$cursos = $crawler->filter{'span class="card-curso__nome"'};

foreach ($cursos as $curso) {
    echo $curso->textContent.PHP_EOL;
}

composer.json

{
    "name": "starkiller42/buscador-cursos",
    "description": "Projeto que busca os cursos no site da Alura",
    "type": "library",
    "authors": [
        {
            "name": "Lucas dos Santos",
            "email": "luc_ssoares@outlook.com"
        }
    ],
    "require": {
        "guzzlehttp/guzzle": "^6.3",
        "symfony/dom-crawler": "^4.2",
        "symfony/css-selector": "^4.3",
        "psr/log": "^1.1"
    }
}

Vi que no site https://packagist.org/packages/guzzlehttp/guzzle ele estava sugerindo o psr/log em vez do symfony/css-selector mas mesmo fazendo o require do psr/log não funcionou.

3 respostas
solução!

Lucas, boa tarde!

Tente alterar para

$cursos = $crawler->filter{'span class="card-curso__nome"'};

Para:

$cursos = $crawler->filter('span class="card-curso__nome"');

Pois o filter é uma função e o argumento precisa passar por parenteses

Espero ter ajudado e bons estudos!

Fala, Lucas!

filter é um método. Para chamar um método rodeamos seus parâmetros com parêntesis.

Então não é

$cursos = $crawler->filter{'span class="card-curso__nome"'};

Este código está errado.

Deveria ser

$cursos = $crawler->filter('span.card-curso__nome');

Obrigado Vinicius e Felipe pela ajuda.

Alterei a linha:

$cursos = $crawler->filter{'span class="card-curso__nome"'};

para:

$cursos = $crawler->filter('span class="card-curso__nome"');

Mas apareceu esse erro:

C:\Users\Usuario\Desktop\Alura\composer\buscador-cursos-alura>php buscar-cursos.php
PHP Fatal error:  Uncaught Symfony\Component\CssSelector\Exception\SyntaxErrorException: Expected identifier, but <string "card-curso__nome" at 6> found. in C:\Users\Usuario\Desktop\Alura\composer\buscador-cursos-alura\vendor\symfony\css-selector\Exception\SyntaxErrorException.php:33
Stack trace:
#0 C:\Users\Usuario\Desktop\Alura\composer\buscador-cursos-alura\vendor\symfony\css-selector\Parser\TokenStream.php(136): Symfony\Component\CssSelector\Exception\SyntaxErrorException::unexpectedToken('identifier', Object(Symfony\Component\CssSelector\Parser\Token))
#1 C:\Users\Usuario\Desktop\Alura\composer\buscador-cursos-alura\vendor\symfony\css-selector\Parser\Parser.php(175): Symfony\Component\CssSelector\Parser\TokenStream->getNextIdentifier()
#2 C:\Users\Usuario\Desktop\Alura\composer\buscador-cursos-alura\vendor\symfony\css-selector\Parser\Parser.php(116): Symfony\Component\CssSelector\Parser\Parser->parseSimpleSelector(Object(Symfony\Component\CssSelector\Parser\TokenStream))
#3 C:\Users\Usuario\Desktop\Alura\composer\buscador in C:\Users\Usuario\Desktop\Alura\composer\buscador-cursos-alura\vendor\symfony\css-selector\Exception\SyntaxErrorException.php on line 33

Fatal error: Uncaught Symfony\Component\CssSelector\Exception\SyntaxErrorException: Expected identifier, but <string "card-curso__nome" at 6> found. in C:\Users\Usuario\Desktop\Alura\composer\buscador-cursos-alura\vendor\symfony\css-selector\Exception\SyntaxErrorException.php:33
Stack trace:
#0 C:\Users\Usuario\Desktop\Alura\composer\buscador-cursos-alura\vendor\symfony\css-selector\Parser\TokenStream.php(136): Symfony\Component\CssSelector\Exception\SyntaxErrorException::unexpectedToken('identifier', Object(Symfony\Component\CssSelector\Parser\Token))
#1 C:\Users\Usuario\Desktop\Alura\composer\buscador-cursos-alura\vendor\symfony\css-selector\Parser\Parser.php(175): Symfony\Component\CssSelector\Parser\TokenStream->getNextIdentifier()
#2 C:\Users\Usuario\Desktop\Alura\composer\buscador-cursos-alura\vendor\symfony\css-selector\Parser\Parser.php(116): Symfony\Component\CssSelector\Parser\Parser->parseSimpleSelector(Object(Symfony\Component\CssSelector\Parser\TokenStream))
#3 C:\Users\Usuario\Desktop\Alura\composer\buscador in C:\Users\Usuario\Desktop\Alura\composer\buscador-cursos-alura\vendor\symfony\css-selector\Exception\SyntaxErrorException.php on line 33

Só depois revendo o vídeo que vi que a forma que eu estava passando o parâmetro estava errada:

Mudei o:

$cursos = $crawler->filter('span class="card-curso__nome"');

Para:

$cursos = $crawler->filter('span.card-curso__nome');