domingo, 1 de janeiro de 2012

(PHP) Pegar todos links em file get contents

Pegar links de uma página utilizando php não é tão díficil quanto parece. Usando DOM em php facilita bastante coisas quando se trata de querer usar algumas funções do javascript no php.

O modo de execução é diferente, claro, mas as funçãoes de DOM tem exatamente as mesmas tarefas de javascript (pelo menos grande maioria delas)

Como por exemplo getElementByID

Enfim, aqui vai um código para pegar todos links de um web site. Isto mesmo, é bastante fácil, nada complicado e não necessita o uso de regex, como muitos pensavam:


// A variável URL armazena o site para listar os links
$url = "http://www.google.com.br";

// Chama a classe DOMDocument, responsável pela tarefa
$dom = new DOMDocument();

// LoadHTML pegará o código proveniente de file_get_contents
@$dom->loadHTML(file_get_contents($url));
// Declara $elementos com vlaor de todos elementos
// No caso apenas pega links contidos nas tags html/body
// Os elementos a serem pegos são os tags a
$elementos = new DOMXPath($dom)->evaluate("html/body//a");

// Inicia um laço for até que um último elemento seja passado
for ($i = 0; $i < $elementos->length; $i++)
{
// Declara $a como elemento passado atual
$a = $elementos->item($i);

// getAttribute pegará um atribute do elemento $a.
// No caso pode ser target, name, entre outros
// Veja mais sobre o elemento 'a' neste site abaixo
// http://www.w3schools.com/tags/tag_a.asp

    $link = $a->getAttribute('href');
}

É isto. Leiam bem os comentários para poder compreender como utilizei a classe dom para pegar todos links de uma página. Espero que apreciem a função.

Abraço

4 comentários:

  1. error nesta linha

    $elementos = new DOMXPath($dom)->evaluate("html/body//a");

    ResponderExcluir
  2. é cara tem um error ai no seu code, mais manipular o dom com php é mesmo incrivel, esse exemplo funciona:
    [code]
    loadHTML($myhtml);

    $tags = $doc->getElementsByTagName('a');

    foreach ($tags as $tag) {
    echo $tag->getAttribute('href');
    }
    ?>
    [/code]

    abraço...

    ResponderExcluir
  3. Não está errado não, depende da versão do seu php. Eu estou utilizando aquele DOM que ainda precisava inicializar as classes (dando o new ali).

    Mas de qualquer forma agradeço pelo comentário, alias, não havia pensando antes em usar foreach, é realmente mais veloz comparando com for

    ResponderExcluir
  4. Tenta o seguinte então:

    $dom = new DOMDocument();
    @$dom->loadHTML(file_get_contents('http://www.google.com'));

    $elementos = new DOMXPath($dom);

    $links = $elementos->evaluate("/html/body//a");

    for ($i = 0; $i < $links->length; $i++) {
    $href = $links->item($i);
    $url = $href->getAttribute('href');
    echo $url.'
    ';
    }

    ResponderExcluir