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.