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ć?

Prashant
źródło
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);
Greg
źródło
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
22

Jeśli chcesz jakoś manipulować pobraną stroną, możesz spróbować parsera PHP DOM. Uważam, że PHP Simple HTML DOM Parser jest bardzo łatwy w użyciu.

Dmitri Pisarev
źródło
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

Ickmund
źródło
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ą.

Stefan Gehrig
źródło
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ą.

prosię
źródło
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;
?>
T.Todua
źródło
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;
Krishnamoorthy Acharya
źródło
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

Rozpoznać
źródło
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);
Abd Abughazaleh
źródło