¿Cómo obtengo el código HTML de una página web en PHP?

91

Quiero recuperar el código HTML de un enlace (página web) en PHP. Por ejemplo, si el enlace es

/programming/ask

luego quiero el código HTML de la página que se sirve. Quiero recuperar este código HTML y almacenarlo en una variable PHP.

¿Cómo puedo hacer esto?

Prashant
fuente
¿Puede explicarlo más? ¿Quieres enviar una solicitud web a una URL determinada y leer la respuesta a una variable, supongo?
Chathuranga Chandrasekara
Sí, lo mismo que quiero, quiero todo el código fuente en una variable devuelta por esa solicitud web.
Prashant
1
Puede utilizar esta herramienta para desechar html fácilmente.
Faraz Kelhini
Incluso con allow_url_fopen establecido en verdadero, ¿esta función no devuelve el HTML de la página? ¿Qué más debo comprobar?
CodeForGood

Respuestas:

140

Si su servidor PHP permite envoltorios de URL fopen, la forma más sencilla es:

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

Si necesita más control, debería mirar las funciones de 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
fuente
Me preocupa 404. En caso de que el enlace no exista, entonces no quiero su contenido, sino que quiero mostrar un mensaje de error. ¿Cómo encontraremos que la URL está dando un error 404 o no (simplemente menas que la URL está funcionando o no)?
Prashant
1
@Prashant: He editado para agregar una llamada curl_getinfo que le dará 200 o 404 o lo que sea
Greg
Además, ¿cómo es posible que PHP obtenga el HTML de la página actual?
Renaro Santos
¿Es esto de dominio cruzado?
I.Am.A. Guy
No funcionará en PHP7. Se comprobó php.ini y fopen está activado.
Kaspar L. Palgi
22

Además, si desea manipular la página recuperada de alguna manera, es posible que desee probar algún analizador DOM de php. Encuentro PHP Simple HTML DOM Parser muy fácil de usar.

Dmitri Pisarev
fuente
11

Es posible que desee consultar las bibliotecas YQL de Yahoo: http://developer.yahoo.com/yql

La tarea en cuestión es tan simple como

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

Puede probar esto en la consola en: http://developer.yahoo.com/yql/console (requiere inicio de sesión)

También vea el screencast de Chris Heilmanns para ver algunas buenas ideas sobre qué más puede hacer: http://developer.yahoo.net/blogs/theater/archives/2009/04/screencast_collates_distributed_information.html

Ickmund
fuente
10

Manera simple: uso file_get_contents():

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

Tenga en cuenta que allow_url_fopendebe estar trueen usted php.inipara poder utilizar envoltorios fopen compatibles con URL.

Manera más avanzada: si no puede cambiar su configuración de PHP, allow_url_fopenes falsepor defecto y si ext / curl está instalado, use la cURLbiblioteca para conectarse a la página deseada.

Stefan Gehrig
fuente
Incluso con allow_url_fopen establecido en verdadero, ¿esta función no devuelve el HTML de la página? ¿Qué más debo comprobar?
CodeForGood
4

podría usar file_get_contents si desea almacenar la fuente como una variable, sin embargo, curl es una mejor práctica.

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

esta solución mostrará la página web en su sitio. Sin embargo, curl es una mejor opción.

cerdo
fuente
2

Aquí hay dos formas diferentes y sencillas de obtener contenido de la URL :

1) el primer método

Habilite Allow_url_include desde su alojamiento (php.ini o en algún lugar)

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

o

2) el segundo método

Habilite php_curl, php_imap y 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
fuente
1

también puede usar el método DomDocument para obtener una variable de nivel de etiqueta HTML individual

$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
fuente
1

$output = file("http://www.example.com");no funcionó hasta que habilité: allow_url_fopen, allow_url_include,y file_uploadsen php.iniPHP7

Conocido
fuente
0

Probé este código y me está funcionando.

$html = file_get_contents('www.google.com');
$myVar = htmlspecialchars($html, ENT_QUOTES);
echo($myVar);
Abd Abughazaleh
fuente