Jak uzyskać kod HTML strony internetowej w PHP?


91

Chcę pobrać kod HTML linku (strony internetowej) w PHP. Na przykład, jeśli link to

/programming/ask

następnie chcę kod HTML wyświetlanej strony. Chcę pobrać ten kod HTML i zapisać go w zmiennej PHP.

Jak mogę to zrobić?


Czy możesz to wyjaśnić bardziej. Chcesz wysłać żądanie internetowe na podany adres URL i przeczytać odpowiedź na zmienną, jak sądzę?
— Chathuranga Chandrasekara

Tak, chcę tego samego, chcę, aby cały kod źródłowy znajdował się w zmiennej zwróconej przez to żądanie sieciowe.
— Prashant

1
Możesz użyć tego narzędzia do łatwego usuwania html.
— Faraz Kelhini

Nawet jeśli allow_url_fopen jest ustawione na true, ta funkcja nie zwraca kodu HTML strony? Co jeszcze mam sprawdzić?
— CodeForGood

Odpowiedzi:


140

Jeśli twój serwer PHP zezwala na otoki url fopen, najprostszym sposobem jest:

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

Jeśli potrzebujesz większej kontroli, powinieneś przyjrzeć się funkcjom 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);

Martwię się o 404. Jeśli link nie istnieje, to nie chcę jego zawartości, zamiast tego chcę wyświetlić komunikat o błędzie? Jak stwierdzimy, że adres URL zawiera błąd 404, czy nie (po prostu adres URL działa, czy nie)?
— Prashant

1
@Prashant: Edytowałem, aby dodać wywołanie curl_getinfo, które da ci 200 lub 404 lub cokolwiek
— Greg

Jak to jest możliwe, że PHP uzyska kod HTML bieżącej strony?
— Renaro Santos

Czy to jest między domenami?
— I.Am.A. Guy

Nie będzie działać na PHP7. Sprawdzono, że php.ini i fopen są włączone.
— Kaspar L. Palgi


11

Możesz chcieć sprawdzić biblioteki YQL z Yahoo: http://developer.yahoo.com/yql

Zadanie do wykonania jest tak proste, jak

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

Możesz to wypróbować w konsoli pod adresem : http://developer.yahoo.com/yql/console (wymaga zalogowania)

Zobacz także screencast Chrisa Heilmanna, aby zobaczyć kilka fajnych pomysłów, co jeszcze możesz zrobić: http://developer.yahoo.net/blogs/theater/archives/2009/04/screencast_collating_distributed_information.html


10

Prosty sposób: Użyj file_get_contents():

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

Pamiętaj, że allow_url_fopenmusisz być truew tobie, php.iniaby móc używać opakowań fopen obsługujących adresy URL.

Bardziej zaawansowany sposób: jeśli nie możesz zmienić konfiguracji PHP, allow_url_fopenjest to falseustawienie domyślne i jeśli zainstalowane jest rozszerzenie / curl, użyj cURLbiblioteki, aby połączyć się z żądaną stroną.


Nawet jeśli allow_url_fopen jest ustawione na true, ta funkcja nie zwraca kodu HTML strony? Co jeszcze mam sprawdzić?
— CodeForGood

4

możesz użyć file_get_contents, jeśli chcesz przechowywać źródło jako zmienną, jednak curl jest lepszą praktyką.

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

to rozwiązanie spowoduje wyświetlenie strony internetowej w Twojej witrynie. Jednak lokowanie jest lepszą opcją.




2

Oto dwa różne, proste sposoby pobierania treści z adresu URL :

1) pierwsza metoda

Włącz Allow_url_include na swoim hostingu (php.ini lub gdzieś)

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

lub

2) druga metoda

Włącz php_curl, php_imap i 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;
?>

1

możesz użyć metody DomDocument, aby uzyskać również indywidualną zmienną poziomu znacznika HTML

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

1

$output = file("http://www.example.com");nie działa, dopóki nie włączone: allow_url_fopen, allow_url_include,a file_uploadspo php.iniza PHP7


0

Wypróbowałem ten kod i działa dla mnie.

$html = file_get_contents('www.google.com');
$myVar = htmlspecialchars($html, ENT_QUOTES);
echo($myVar);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.