Як отримати 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.