Comment obtenir le code HTML d'une page Web en PHP?

91

Je souhaite récupérer le code HTML d'un lien (page web) en PHP. Par exemple, si le lien est

/programming/ask

alors je veux le code HTML de la page qui est servie. Je veux récupérer ce code HTML et le stocker dans une variable PHP.

Comment puis-je faire ceci?

Prashant
la source
Pouvez-vous s'il vous plaît l'expliquer davantage. Vous souhaitez envoyer une requête Web à une URL donnée et lire la réponse à une variable, je suppose?
Chathuranga Chandrasekara
Oui, même chose que je veux, je veux tout le code source dans une variable renvoyée par cette requête Web.
Prashant
1
Vous pouvez utiliser cet outil pour supprimer facilement du HTML.
Faraz Kelhini
Même avec allow_url_fopen défini sur true, cette fonction ne renvoie pas le HTML de la page? Que dois-je vérifier d'autre?
CodeForGood

Réponses:

138

Si votre serveur PHP autorise les wrappers fopen url, le moyen le plus simple est:

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

Si vous avez besoin de plus de contrôle, vous devriez regarder les fonctions 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
la source
Je suis inquiet pour 404. Dans le cas où le lien n'existe pas, alors je ne veux pas de son contenu, à la place je veux afficher un message d'erreur ?? Comment nous trouverons que l'URL donne une erreur 404 ou non (simplement l'URL de menas fonctionne ou non)?
Prashant
1
@Prashant: J'ai édité pour ajouter un appel curl_getinfo qui vous donnera 200 ou 404 ou autre
Greg
Aussi comment PHP peut-il obtenir le code HTML de la page actuelle?
Renaro Santos
Est-ce interdomaine?
I.Am.A.Guy
Ne fonctionnera pas sur PHP7. Vérifié le php.ini et fopen est activé.
Kaspar L. Palgi
22

Aussi, si vous voulez manipuler la page récupérée d'une manière ou d'une autre, vous voudrez peut-être essayer un analyseur PHP DOM. Je trouve PHP Simple HTML DOM Parser très facile à utiliser.

Dmitri Pisarev
la source
11

Vous pouvez consulter les bibliothèques YQL de Yahoo: http://developer.yahoo.com/yql

La tâche à accomplir est aussi simple que

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

Vous pouvez essayer ceci dans la console à l' adresse : http://developer.yahoo.com/yql/console (nécessite une connexion)

Voir également le screencast de Chris Heilmann pour quelques bonnes idées sur ce que vous pouvez faire de plus: http://developer.yahoo.net/blogs/theater/archives/2009/04/screencast_collating_distributed_information.html

Ickmund
la source
10

Manière simple: utilisez file_get_contents():

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

Veuillez noter que cela allow_url_fopendoit être trueen vous php.inipour pouvoir utiliser des wrappers fopen prenant en charge les URL.

Méthode plus avancée: si vous ne pouvez pas modifier votre configuration PHP, allow_url_fopenc'est falsepar défaut et si ext / curl est installé, utilisez la cURLbibliothèque pour vous connecter à la page souhaitée.

Stefan Gehrig
la source
Même avec allow_url_fopen défini sur true, cette fonction ne renvoie pas le HTML de la page? Que dois-je vérifier d'autre?
CodeForGood le
4

vous pouvez utiliser file_get_contents si vous souhaitez stocker la source en tant que variable, mais curl est une meilleure pratique.

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

cette solution affichera la page Web sur votre site. Cependant, curl est une meilleure option.

porcherie
la source
2

Voici deux façons simples et différentes d'obtenir du contenu à partir d'une URL :

1) la première méthode

Activez Allow_url_include depuis votre hébergement (php.ini ou ailleurs)

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

ou

2) la deuxième méthode

Activer php_curl, php_imap et 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
la source
1

vous pouvez également utiliser la méthode DomDocument pour obtenir une variable de niveau de balise HTML individuelle

$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
la source
1

$output = file("http://www.example.com");ne fonctionnait pas jusqu'à ce que j'ENABLED: allow_url_fopen, allow_url_include,et file_uploadsdans php.inipour PHP7

Ken
la source