Как читать веб-страницу в PHP

Я пытаюсь сохранить некоторые веб-страницы в текстовых файлах, используя PHP-скрипты.

Как загрузить веб-страницу в буфер с PHP и удалить теги HTML?

Ответы

Ответ 1

  • Простой способ: fopen() или file_get_contents() URL: fopen("http://google.com/", "r")
  • Умный способ: используйте cURL библиотека
  • Другим умным способом: http_get() из PHP http
  • Трудный путь: создайте HTTP-запрос и отправьте его fsockopen() или stream_socket_client()
  • C-путь: отправьте HTTP-запрос, используя sockets
  • Глупый способ: вызвать внешний инструмент, например wget или curl через system()

Ни один из них не будет доступен на вашем сервере.

Ответ 2

Один из способов:

$url = "http://www.brothersoft.com/publisher/xtracomponents.html";
$page = file_get_contents($url);
$outfile = "xtracomponents.html";
file_put_contents($outfile, $page);

Вышеприведенный код является просто примером и не имеет (!) проверки ошибок и обработки.

Ответ 3

Как говорили другие ответы, либо стандартные функции потока PHP, либо cURL - ваш лучший выбор для извлечения HTML. Что касается удаления тегов, вот пара подходит:

Вариант № 1. Используйте расширение Tidy, если оно доступно на вашем сервере, для рекурсивного просмотра дерева документов и возврата текста из узлов. Что-то вроде этого:

function textFromHtml(TidyNode $node) {
    if ($node->isText()) {
        return $node->value;
    } else if ($node->hasChildren()) {
        $childText = '';
        foreach ($node->child as $child)
           $childText .= textFromHtml($child);
        return $childText;
    }
    return '';
}

Вам может понадобиться нечто более сложное, например, заменяющее теги <br /> (где $node->name == 'br') символами новой строки, но это будет сделано для начала.

Затем загрузите текст HTML в объект Tidy и вызовите свою функцию на теле node. Если у вас есть содержимое в строке, используйте:

$tidy = new tidy();
$tidy->parseString($contents);
$text = textFromHtml($tidy->body());

Вариант № 2. Используйте регулярные выражения для разделения всего между < и >. Вы могли бы (и, вероятно, должны) разработать более сложное регулярное выражение, которое, например, соответствовало бы только действительным стартовым или конечным тегам HTML. Любые ошибки в синаксисе страницы, такие как скользящая угловая скобка в основном тексте, могут означать вывод мусора, если вы не будете осторожны. Вот почему Tidy настолько хорош (он специально разработан для очистки плохих страниц), но он может быть недоступен.

Ответ 4

Я настоятельно рекомендую вам взглянуть на класс SimpleHTML DOM;

SimpleHTML DOM Parser в SourceForge

С его помощью вы можете искать дерево DOM с помощью селекторов css, например, с помощью функции jQuery $() или prototypeJS $$().

Хотя он работает с файлом_get_contents() для получения содержимого веб-страницы, вы можете передать его HTML только с некоторым классом cURL (если вам нужно зайти в систему и т.д.)