Як отримати HTML-код веб-сторінки в PHP?


91

Я хочу отримати HTML-код посилання (веб-сторінки) у PHP. Наприклад, якщо посилання є

/programming/ask

тоді я хочу HTML-код сторінки, яка обслуговується. Я хочу отримати цей HTML-код і зберегти його у змінній PHP.

Як я можу це зробити?


Ви можете пояснити це докладніше. Ви хочете надіслати веб-запит на вказану URL-адресу та прочитати відповідь на змінну, я думаю?
Чатуранга Чандрасекара

Так, те саме, що я хочу, я хочу, щоб весь вихідний код у змінній повертався цим веб-запитом.
Прашант,

1
Ви можете використовувати цей інструмент для легкого скасування html.
Faraz Kelhini

Навіть якщо для параметра allow_url_fopen встановлено значення true, ця функція не повертає HTML сторінки? Що ще слід перевірити?
CodeForGood

Відповіді:


140

Якщо ваш PHP-сервер дозволяє обгортки url fopen, то найпростіший спосіб:

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

Якщо вам потрібен більше контролю, тоді вам слід розглянути функції 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);

Мене турбує 404. Якщо посилання не існує, то я не хочу його вмісту, натомість хочу відобразити повідомлення про помилку ?? Як ми виявимо, що URL-адреса видає помилку 404 чи ні (просто URL-адреса menas працює чи ні)?
Прашант,

1
@Prashant: Я редагував, щоб додати виклик curl_getinfo, який дасть вам 200 або 404 або що завгодно
Грег,

Також як можливо PHP отримати поточну сторінку HTML?
Ренаро Сантос,

Це міждомен?
I.Am.A.Guy

Не працюватиме на PHP7. Перевірив php.ini та fopen увімкнено.
Каспар Л. Палгі

22

Крім того, якщо ви хочете якось маніпулювати отриманою сторінкою, ви можете спробувати якийсь синтаксичний аналізатор PHP DOM. Я вважаю PHP Simple HTML DOM Parser дуже простим у використанні.


11

Можливо, ви захочете перевірити бібліотеки YQL від Yahoo: http://developer.yahoo.com/yql

Завдання, яке виконується, настільки ж просте, як

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

Ви можете спробувати це в консолі за адресою: http://developer.yahoo.com/yql/console (потрібен вхід)

Також перегляньте скринкаст Кріса Хайльманна, щоб побачити кілька приємних ідей, що ще можна зробити: http://developer.yahoo.net/blogs/theater/archives/2009/04/screencast_collating_distributed_information.html


10

Простий спосіб: Використовуйте file_get_contents():

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

Зверніть увагу, це allow_url_fopenповинно бути trueу васphp.ini щоб мати змогу використовувати обгортки fopen з інформацією про URL.

Більш просунутий спосіб: Якщо ви не можете змінити конфігурацію PHP, allow_url_fopenце falseза замовчуванням, і якщо встановлено ext / curl, використовуйте cURLбібліотеку для підключення до потрібної сторінки.


Навіть якщо для параметра allow_url_fopen встановлено значення true, ця функція не повертає HTML сторінки? Що ще слід перевірити?
CodeForGood

4

Ви можете використовувати file_get_contents, якщо хочете зберегти джерело як змінну, однак curl є кращим практичним завданням.

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

це рішення відображатиме веб-сторінку на вашому сайті. Однак кращий варіант - завивка.




2

Ось два різні, прості способи отримання вмісту з URL-адреси :

1) перший спосіб

Увімкніть Allow_url_include з вашого хостингу (php.ini або деінде)

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

або

2) другий спосіб

Увімкніть php_curl, php_imap та 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

Ви можете використовувати метод DomDocument, щоб отримати окрему змінну рівня тегу 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");не працює , поки не включено: allow_url_fopen, allow_url_include,і file_uploadsв php.iniпротягом PHP7


0

Я спробував цей код, і він працює на мене.

$html = file_get_contents('www.google.com');
$myVar = htmlspecialchars($html, ENT_QUOTES);
echo($myVar);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.