Percorrendo elementos de um HTML com PHP

Artigo que apresenta o PHP DOM, um recurso que permite encontrar/manipular elementos em uma estrutura XML ou HTML.

Muitas vezes vi programadores perguntando como se faz para um script PHP obter os links de um documento HTML (obter os links de uma página) ou então as imagens (obter as imagens de uma página) ou outro elemento qualquer. Este artigo mostra como percorrer elementos de um documento HTML e capturá-los de acordo com seu nome ou atributo. Para tanto, é utilizada a extensão DOM.

Usain Bold percorrendo uma pista com HTML

Para obter todos elementos de um documento HTML você tem duas opções: (i) realizar buscas via expressão regular, ou (ii) utilizar algum recurso capaz de ler todo o documento e estruturá-lo na forma de um objeto (ou outra estrutura de dados organizada).

Usar expressões regulares pode ser simples, em alguns casos. No entanto, a segunda opção tende a ser mais segura. Já vimos que a extensão SimpleXML é capaz de estruturar um XML em um objeto de fácil manipulação. No entanto, nem todas páginas são XHTML válidas. Para ler um documento HTML 4.01, por exemplo, ela pode não funcionar. Por outro lado, a extensão DOM é capaz de ler um documento HTML e, inclusive, ignorar alguns erros de sintaxe. DOM é uma especificação definda pela W3C e normalmente é implementada em JavaScript nativamente. Em PHP, as classes e métodos tem o mesmo nome e funcionamento, mudando apenas a sintaxe da linguagem (para um objeto invocar um método, por exemplo, usa-se "." em JavaScript, mas usa-se "->" em PHP).

Veja um exemplo de como percorrer os links e as imagens de uma página e exibir o conteúdo do atributo "href" dos links e "src" das imagens:

$dom = new DOMDocument();
$dom->loadHTMLFile('teste.html');

// Consultando os links
$links = $dom->getElementsByTagName('a');
foreach ($links as $link) {
    echo $link->getAttribute('href').PHP_EOL;
}

// Consultando as imagens
$imgs = $dom->getElementsByTagName('img');
foreach ($imgs as $img) {
    echo $img->getAttribute('src').PHP_EOL;
}

O método loadHTMLFile serve para ler um documento HTML no próprio servidor ou em um endereço web externo (caso o PHP esteja devidamente configurado para permitir isso). Já o método loadHTML recebe um código HTML diretamente.

A extensão DOM possui muitas outras funcionalidades úteis. Vale a pena dar uma olhada na documentação da extensão DOM.

5 comentários

Rubens Takiguti Ribeiro (autor do blog) disse...

Obrigado, Vine.

Esse post foi inspirado pelas várias pessoas que vi perguntando sobre isso. Se tiver sugestão de assuntos, pode postar ali na caixa de sugestões ali do lado.

Anônimo disse...

Cara e como eu faço para acessar os elementos html em uma outra página php ?

Rubens Takiguti Ribeiro (autor do blog) disse...

Olá, Anônimo

No método "loadHtmlFile" você pode passar a URL da página desejada. Só precisa se assegurar que seu PHP esteja habilitado para fazer consultas a outras URLs com a diretiva de configuração "allow_url_fopen" (no seu php.ini).

Outra possibilidade é obter o conteúdo HTML da página (com CURL, por exemplo), e passar o HTML obtido para o método "loadHtml".