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

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

Как я могу загрузить веб-страницу в буфер файлов с помощью PHP и удалить теги HTML?

4 ответа

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

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

В одну сторону:

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

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

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

Вариант № 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 и вызовите свою функцию на узле body. Если у вас есть содержимое в строке, используйте:

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

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

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

SimpleHTML DOM Parser на SourceForge

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

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

Другие вопросы по тегам