Como obtenho o código HTML de uma página da web em PHP?

91

Quero recuperar o código HTML de um link (página da web) em PHP. Por exemplo, se o link for

/programming/ask

então eu quero o código HTML da página que é servida. Quero recuperar esse código HTML e armazená-lo em uma variável PHP.

Como posso fazer isso?

Prashant
fonte
Você pode explicar mais. Você deseja enviar uma solicitação da web para um determinado URL e ler a resposta para uma variável, eu acho?
Chathuranga Chandrasekara
Sim, a mesma coisa que eu quero, quero todo o código-fonte em uma variável retornada por essa solicitação da web.
Prashant
1
Você pode usar esta ferramenta para facilmente descartar html.
Faraz Kelhini de
Mesmo com allow_url_fopen definido como true, esta função não retorna o HTML da página? O que mais devo verificar?
CodeForGood

Respostas:

138

Se o seu servidor PHP permite wrappers url fopen, a maneira mais simples é:

$html = file_get_contents('/programming/ask');

Se precisar de mais controle, você deve olhar para as funções cURL :

$c = curl_init('/programming/ask');
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
//curl_setopt(... other options you want...)

$html = curl_exec($c);

if (curl_error($c))
    die(curl_error($c));

// Get the status code
$status = curl_getinfo($c, CURLINFO_HTTP_CODE);

curl_close($c);
Greg
fonte
Estou preocupado com o 404. Caso o link não exista, então não desejo o seu conteúdo, em vez disso, desejo exibir uma mensagem de erro ?? Como descobriremos se o url está apresentando o erro 404 ou não (simplesmente menas URL está funcionando ou não)?
Prashant
1
@Prashant: Eu editei para adicionar uma chamada curl_getinfo que dará a você 200 ou 404 ou o que quer que seja
Greg
Além disso, como é possível o PHP obter o HTML da página atual?
Renaro Santos
Este é um domínio cruzado?
I.Am.A.Guy
Não funciona no PHP7. Foi verificado se o php.ini e o fopen estão Ativados.
Kaspar L. Palgi
22

Além disso, se você deseja manipular a página recuperada de alguma forma, você pode tentar algum analisador DOM de php. Acho que o PHP Simple HTML DOM Parser é muito fácil de usar.

Dmitri Pisarev
fonte
11

Você pode verificar as bibliotecas YQL do Yahoo: http://developer.yahoo.com/yql

A tarefa em mãos é tão simples quanto

select * from html where url = 'http://stackoverflow.com/questions/ask'

Você pode tentar isso no console em: http://developer.yahoo.com/yql/console (requer login)

Veja também o screencast de Chris Heilmanns para algumas boas idéias sobre o que mais você pode fazer: http://developer.yahoo.net/blogs/theater/archives/2009/04/screencast_collating_distributed_information.html

Ickmund
fonte
10

Maneira simples: Use file_get_contents():

$page = file_get_contents('http://stackoverflow.com/questions/ask');

Por favor note que allow_url_fopendeve estar trueem você php.inipara ser capaz de usar wrappers URL-aware.

Forma mais avançada: se você não pode alterar a configuração do PHP,allow_url_fopen é falsepor padrão e se ext / curl estiver instalado, use a cURLbiblioteca para se conectar à página desejada.

Stefan Gehrig
fonte
Mesmo com allow_url_fopen definido como true, esta função não retorna o HTML da página? O que mais devo verificar?
CodeForGood
4

você pode usar file_get_contents se quiser armazenar a fonte como uma variável, entretanto curl é uma prática melhor.

$url = file_get_contents('http://example.com');
echo $url; 

esta solução exibirá a página da web em seu site. No entanto, o curl é uma opção melhor.

chiqueiro
fonte
2

Aqui estão duas maneiras diferentes e simples de obter conteúdo de URL :

1) o primeiro método

Habilite Allow_url_include de sua hospedagem (php.ini ou outro lugar)

<?php
$variableee = readfile("http://example.com/");
echo $variableee;
?> 

ou

2) o segundo método

Habilite php_curl, php_imap e php_openssl

<?php
// you can add anoother curl options too
// see here - http://php.net/manual/en/function.curl-setopt.php
function get_dataa($url) {
  $ch = curl_init();
  $timeout = 5;
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
  curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}

$variableee = get_dataa('http://example.com');
echo $variableee;
?>
T.Todua
fonte
1

você pode usar o método DomDocument para obter uma variável de nível de tag HTML individual também

$homepage = file_get_contents('https://www.example.com/');
$doc = new DOMDocument;
$doc->loadHTML($homepage);
$titles = $doc->getElementsByTagName('h3');
echo $titles->item(0)->nodeValue;
Krishnamoorthy Acharya
fonte
1

$output = file("http://www.example.com");não funcionou até que eu habilitei: allow_url_fopen, allow_url_include,e file_uploadsno php.inipara PHP7

Ken
fonte