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

Erro ao usar o DOMCrawler

Não estou conseguindo entender o que está errado no meu código:

<?php

require 'vendor/autoload.php';

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

$client = new Client(['verify'=>false]);
$resposta = $client->request('GET', 'https://www.alura.com.br/cursos-online-programacao/php');

$html = $resposta->getBody();

$crawler = New Crawler($html);

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

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

Tenho tido 2 tipos de erros. Um é na linha

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

aonde parece que o argumento que estou usando não é válido. Está dando a seguinte mensagem: "Expected parameter of type 'Symfony\Component\DomCrawler\string', 'string' provided".

O segundo erro é durante a execução, o erro que aparece é o seguinte:

C:\Users\mfari\Downloads\COMPUTAÇÃO\PHP\php-8.0.6-nts-Win32-vs16-x64\php.exe "C:\Users\mfari\Desktop\ESTUDOS\PHP\PHP - PROJETOS\Explorando-sites.php" PHP Fatal error: Uncaught InvalidArgumentException: Expecting a DOMNodeList or DOMNode instance, an array, a string, or null, but got "GuzzleHttp\Psr7\Stream". in C:\Users\mfari\Desktop\ESTUDOS\PHP\PHP - PROJETOS\vendor\symfony\dom-crawler\Crawler.php:132 Stack trace:

#0 C:\Users\mfari\Desktop\ESTUDOS\PHP\PHP - PROJETOS\vendor\symfony\dom-crawler\Crawler.php(78): Symfony\Component\DomCrawler\Crawler->add(Object(GuzzleHttp\Psr7\Stream))

#1 C:\Users\mfari\Desktop\ESTUDOS\PHP\PHP - PROJETOS\Explorando-sites.php(18): Symfony\Component\DomCrawler\Crawler->__construct(Object(GuzzleHttp\Psr7\Stream))

#2 {main} thrown in C:\Users\mfari\Desktop\ESTUDOS\PHP\PHP - PROJETOS\vendor\symfony\dom-crawler\Crawler.php on line 132

Fatal error: Uncaught InvalidArgumentException: Expecting a DOMNodeList or DOMNode instance, an array, a string, or null, but got "GuzzleHttp\Psr7\Stream". in C:\Users\mfari\Desktop\ESTUDOS\PHP\PHP - PROJETOS\vendor\symfony\dom-crawler\Crawler.php:132 Stack trace:

#0 C:\Users\mfari\Desktop\ESTUDOS\PHP\PHP - PROJETOS\vendor\symfony\dom-crawler\Crawler.php(78): Symfony\Component\DomCrawler\Crawler->add(Object(GuzzleHttp\Psr7\Stream))

#1 C:\Users\mfari\Desktop\ESTUDOS\PHP\PHP - PROJETOS\Explorando-sites.php(18): Symfony\Component\DomCrawler\Crawler->__construct(Object(GuzzleHttp\Psr7\Stream))

#2 {main} thrown in C:\Users\mfari\Desktop\ESTUDOS\PHP\PHP - PROJETOS\vendor\symfony\dom-crawler\Crawler.php on line 132

Process finished with exit code 255

2 respostas
solução!

Olá Marcelo

Faltam 2 coisas em seu código:

  • precisa converter o html para string para utilizar no Crawler $html = $resposta->getBody()->getContents();
  • precisa incluir o pacote para trabalhar com css composer require symfony/css-selector

Referencia: https://jciel.github.io/2019/PHP-web-crawler-com-dom-crawler-component-do-symfony/

Resultado:

Curso Introdução ao PHP: Primeiros passos com a linguagem
Curso PHP e MySQL: Introdução a uma webapp
Curso Avançando com PHP: Arrays, Strings, Função e Web
Curso PHP Strings: Operações e expressões regulares
Curso PHP: Manipulando coleções com Arrays
Curso PHP: Dominando as Collections
Curso Orientação a Objetos com PHP: Classes, métodos e atributos
Curso Avançando com Orientação a Objetos com PHP: Herança, Polimorfismo e Interfaces
Curso PHP Brasil: Validação de dados no padrão nacional
Curso PHP Composer: Dependências, Autoload e Publicação
Curso PHP Exceptions: Tratamento de erros
Curso PHP I/O: Trabalhando com arquivos e streams
Curso PHP e Behavior Driven Development: BDD com Behat
Curso PHP Parallel: Processos, Threads e Channels
Curso Object Calisthenics: Exercitando a Orientação a Objetos
Curso Metaprogramação com PHP: API de Reflection
Curso Scraping com PHP: Coleta de dados na web
Curso PHP e Clean Architecture: Descomplicando arquitetura de software
Curso PHP e Domain Driven Design: Apresentando os conceitos
Curso PHP: Programação Funcional
Curso PHP Reativo: Programação assíncrona em tempo real
Curso Magento: Primeiros passos no gerenciamento de uma loja
Curso Magento: Customização de um tema
Curso Refatoração em PHP: Boas práticas no seu código
Curso MVC com PHP: Entenda o padrão Model-View-Controller
Curso Laravel parte 1: Produtividade no desenvolvimento web
Curso Laravel parte 2: Trabalhando com Autenticação, Relacionamentos e Testes
Curso Laravel parte 3: Eventos, filas, upload e e-mail
Curso PHP e Selenium: Testes de ponta a ponta
Curso PHP e PDO: Trabalhando com bancos de dados
Curso Doctrine ORM: Acesse o banco com Mapeamento Objeto-Relacional
Curso Doctrine ORM: Mapeie um banco legado com XML
Curso Doctrine ORM: Use índices, SQL nativo, funções e stored procedures
Curso Symfony Parte 1: Criação de uma API Restful
Curso Symfony Parte 2: Autenticação e HATEOAS
Curso Symfony Parte 3: Tratamento de erros, cache, logs e testes
Curso Lumen: API Rest com o Micro-framework do Laravel
Curso PHP Refatoração: Boas práticas no seu código
Curso Design Patterns em PHP: Padrões comportamentais
Curso Design Patterns em PHP: Padrões estruturais
Curso Design Patterns em PHP: Padrões criacionais
Curso SOLID com PHP: Princípios da programação orientada a objetos
Curso PHP e TDD: Testes com PHPUnit
Curso Mocks em PHP: Entenda os dublês de testes
Curso Testes de integração com PHP: Testando o acesso à API e ao banco de dados
Curso PHP Xdebug: Ferramenta de debug e profiling

Bora codar!

Boa! Funcionou aqui com o que você me falou. Obrigado pela ajuda!