Как читать веб-страницу на PHP - PullRequest
15 голосов
/ 13 февраля 2010

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

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

Ответы [ 4 ]

63 голосов
/ 14 февраля 2010
  • Простой способ: 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()

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

6 голосов
/ 14 февраля 2010

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

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

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

2 голосов
/ 14 февраля 2010

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

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

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

0 голосов
/ 23 февраля 2010

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

SimpleHTML DOM Parser на SourceForge

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...