Как читать веб-страницу на PHP
Я пытаюсь сохранить некоторые веб-страницы в текстовые файлы, используя PHP-скрипты.
Как я могу загрузить веб-страницу в буфер файлов с помощью PHP и удалить теги HTML?
4 ответа
- Простой способ:
fopen()
или жеfile_get_contents()
URL:fopen("http://google.com/", "r")
- Умный способ: используйте библиотеку cURL
- Другой умный способ:
http_get()
из PHPhttp
модуль - Сложный путь: создать запрос 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 (если вам необходимо войти в систему и т. Д.)