- screaming.computer
- Install the PHP Simple HTML DOM Parser for easy web scraping
- Install SimpleHtmlDom using composer
- Scrape the web using PHP
- Colophon
- PHP парсинг HTML, с помощью simple HTML DOM
- Шаг 1 – Подготовка
- Шаг 2 – Основы HTML парсинга
- Загрузка HTML
- Получение доступа к HTML DOM объектам
- Другие селекторы
- Документация библиотеки simple HTML DOM
- Шаг 3 – Реальный пример PHP парсинга HTML документа
- Шаг 4 – Пишем основную функцию PHP парсера HTML
- Шаг 5 – Находим нужную информацию
- Шаг 6 – Выводим результат парсинга
- Заключение
screaming.computer
Install the PHP Simple HTML DOM Parser for easy web scraping
When brainstorming for this project, I knew I’d eventually need to write a web scraper to gather text content for the screaming.computer. I did quite a bit of Googling, and none of the scraping options looked promising. The available PHP libraries tended to be wildly overcomplicated for my needs, or very out-of-date, or just unnecessarily difficult to use. There were also a bunch of cloud-based scrapers and a few browser plugins, but these have dependencies I’d rather avoid.
Discovering the PHP Simple HTML DOM Parser library was like striking gold. It’s up-to-date, easy-to-use, and still quite fully-featured.
Install SimpleHtmlDom using composer
Having previously installed composer to manage another library, it’s already available on my LAMP server.
Create a directory for the SimpleHtmlDom library:
mkdir /var/www/_simplehtmldom
cd /var/www/_simplehtmldom
Attempt to install the library stable version:
composer require simplehtmldom/simplehtmldom
Could not find a version of package simplehtmldom/simplehtmldom matching your minimum-stability (stable).
Attempt to install any available version of the library:
composer require simplehtmldom/simplehtmldom:*
Your requirements could not be resolved to an installable set of packages.
The requested package simplehtmldom/simplehtmldom * is satisfiable by simplehtmldom/simplehtmldom [2.0-RC2, dev-master] but these conflict with your requirements or minimum-stability.
Okay, fine, we’ll install the Release Candidate by name:
composer require simplehtmldom/simplehtmldom:2.0-RC2
Clearly I don’t know anything about how to use composer , but we have success nonetheless!
Scrape the web using PHP
This PHP fragment shows one basic use of SimpleHtmlDom — loading the CBC website and printing a list of all links on the page:
require_once (‘/var/www/_simplehtmldom/vendor/autoload.php’);
use simplehtmldom\HtmlWeb;
$webParser = new HtmlWeb();
$htmlDoc = $webParser->load (‘https://www.cbc.ca/news/’);
foreach ($htmlDoc->find (‘a’) as $anchor)
echo $anchor->href, ‘
‘;
There are also some very helpful examples at the SimpleHtmlDom site.
Colophon
Weblog and project page of Adam Rogers — videographer by day, photographer/ tech enthusiast/ mad scientist by night • SCREAMING.COMPUTER is a poetry-generating automaton which feeds on scans of daily news • © 2019-2023 by Adam Rogers
Email: echo (at) screaming (dot) computer
Broadcasting from twenty minutes into the future.
PHP парсинг HTML, с помощью simple HTML DOM
Если вам необходимо сделать парсинг HTML документа, регулярные выражения не наилучший способ для этого. К тому же их написание, трудоемкий процесс, и они уменьшают скорость работы PHP приложения. В этой статье, вы узнаете, как использовать свободный парсер HTML, для чтения, изменения, извлечения некоторых DOM элементов из HTML страниц. Причем, HTML ресурсом может быть внешний источник. То есть адрес HTML страницы на другом домене. Используя, как пример, сайт sitear.ru, вы узнаете, как получить и вывести список всех опубликованных материалов на главной странице сайта. Другими словами, вы будете делать то, что вам необходимо, парсинг HTML с помощью PHP. В данном случае под PHP, подразумевается библиотека simple HTML DOM.
Просто следуйте всем шагам статьи, и узнаете много нового и полезного для себя!
Шаг 1 – Подготовка
Для начала, вам необходимо скачать копию simple HTML dom библиотеки. Скачивание свободно.
В архиве вы найдете несколько файлов, но нам необходим только один — simple_html_dom.php. Все остальные, это примеры и документация.
Шаг 2 – Основы HTML парсинга
Эта библиотека, очень проста в использовании, но все же, необходимо разобрать некоторые основы, перед тем как ее использовать.
Загрузка HTML
$html = new simple_html_dom(); // Load from a string $html->load('Hello World!
We're here
'); // Load a file $html->load_file('http://sitear.ru/');
Все просто, вы можете создать объект, загружая HTML из строки. Или, загрузить HTML код из файла. Загрузить файл вы можете по URL адресу, или с вашей локальной файловой системы (сервера).
Важно помнить: Метод load_file(), работает на использовании PHP функции file_get_contents. Если в вашем файле php.ini, параметр allow_url_fopen не установлен как true, вы не сможете получать HTML файлы по удаленному адресу. Но, вы сможете загрузить эти файлы, используя библиотеку CURL. Далее, прочитать содержимое, используя метод load().
Получение доступа к HTML DOM объектам
Предположим у нас уже есть DOM объект, структурой, как на картинке выше. Вы можете начать работать с ним, используя метод find(), и создавая коллекции. Коллекции – это группы объектов, найденные с помощью селекторов – синтаксис в чем-то схож с jQuery.
Используя этот пример HTML кода, мы узнаем, как получить доступ к информации заключенной во втором параграфе (p). Также, мы изменим полученную информацию и выведем результат на дисплей.
// создание объекта парсера и получение HTML include('simple_html_dom.php'); $html = new simple_html_dom(); $html->load("Hello World!
We're here
"); // получение массивов параграфов $element = $html->find("p"); // изменение информации внутри параграфа $element[1]->innertext .= " and we're here to stay."; // вывод echo $html->save();
Как видите реализовать PHP парсинг документа HTML, очень даже просто, используя simple HTML DOM библиотеку. В принципе, в этом куске PHP кода, все можно понять интуитивно, но если вы в чем-то сомневаетесь, мы рассмотрим код.
Линия 2-4: подключаем библиотеку, создаем объект класса и загружаем HTML код из строки.
Линия 7: С помощью данной строки, находим все
теги в HTML коде, и сохраняем в переменной в виде массива. Первый параграф будет иметь индекс 0, остальные параграфы будут индексированы соответственно 1,2,3…
Линия 10: Получаем содержимое второго параграфа в нашей коллекции. Его индекс будет 1. Также мы вносим изменения в текст с помощью атрибута innertext. Атрибут innertext, меняет все содержимое внутри указанного тега. Также мы сможем изменить сам тег с помощью атрибута outertext.
Давайте добавим еще одну строку PHP кода, с помощью которой мы назначим класс стиля нашему параграфу.
$element[1]->class = "class_name"; echo $html->save();
Результатом выполнения нашего кода будет следующий HTML документ:
Hello World!
We're here and we're here to stay.
Другие селекторы
Ниже приведены другие примеры селекторов. Если вы использовали jQuery, то в библиотеке simple html dom синтаксис немножко схожий.
// получить первый элемент с $single = $html->find('#foo', 0); // получает при парсинге все элементы с классом $collection = $html->find('.foo'); // получает все теги при парсинге htmlдокумента $collection = $html->find('a'); // получает все теги , которые помещены в тег $collection = $html->find('h1 a'); // получает все изображения с title='himom' $collection = $html->find('img[title=himom]');
Использование первого селектора при php парсинге html документа, очень простое и понятное. Его уникальность в том что он возвращает только один html элемент, в отличии от других, которые возвращают массив (коллекцию). Вторым параметром (0), мы указываем, что нам необходим только первый элемент нашей коллекции. Надеюсь, вам понятны все варианты селекторов библиотеки simple HTML DOM, если вы чего-то не поняли, попробуйте метод научного эксперимента. Если даже он не помог, обратитесь в комментарии к статье.
Документация библиотеки simple HTML DOM
Полнейшую документацию по использованию библиотеки simple HTML DOM вы сможете найти по этому адресу:
Просто предоставлю вам иллюстрацию, которая показывает возможные свойства выбранного HTML DOM элемента.
Шаг 3 – Реальный пример PHP парсинга HTML документа
Для примера парсинга, и приведения HTML DOM библиотеки в действие, мы напишем грабер материалов на сайте sitear.ru. Далее мы выведем все статьи в виде списка, в котором будут указаны названия статей. При написании граберов, помните, кража контента преследуется законом! Но не в случае, когда на странице стоит активная ссылка на исходный документ.
include('simple_html_dom.php'); $articles = array(); getArticles('http://sitear.ru/');
Начинаем с подключения библиотеки, и вызова функции getArticles, которая будет парсить HTML документы соответственно адресу страницы, которая передается в качестве параметра функции.
Также мы указываем глобальный массив, в котором будет, хранится вся информация о статьях. Перед тем как начать парсинг HTML документа, давайте посмотрим, как он выглядит.
Название материалаПросмотров: 35Описание статьи…
Это базовый шаблон данной страницы. При написании парсера html, нужно тщательно исследовать документ, так как и комментарии, типа , это тоже потомки. Другими словами, в глазах библиотеки simple HTML DOM, это элементы, которые равноценны другим тегам страницы.
Шаг 4 – Пишем основную функцию PHP парсера HTML
function getArticles($page) < global $articles; $html = new simple_html_dom(); $html->load_file($page); // . далее будет . >
Вначале функции, мы вызываем наш глобальный массив, который мы указали ранее. Создаем новый объект simple_html_dom. Далее загружаем страницу, которую будем парсить.
Шаг 5 – Находим нужную информацию
$items = $html->find('div[class=name_material]'); foreach($items as $names) < $articles[] = array($post->children(0)->plaintext); >
В этом куске кода все предельно просто, мы находим все div с Далее читаем коллекцию элементов и выбираем названия материалов. Все материалы будут сохранены в массиве в данном виде:
$articles[0] = "Имя материала 1"; $articles[1] = "Имя материала 2"; …
Шаг 6 – Выводим результат парсинга
Для начала, мы установим некоторые стили, для красоты выводимой информации, которую получили при парсинге.
Далее, с помощью нескольких строк PHP кода, мы выведем информацию.
Результатом выполнения данного скрипта, будет список названий статей на сайте sitear.ru.
Заключение
Вот мы и научились php парсингу html документов. Помните, что парсинг это долгий процесс. Одна страница может парситься около одной секунды. Если вы будете делать парсинг большого числа HTML документов, ваш сервер может перервать работу скрипта в связи с истечением время отведенного для выполнения. Это можно исправить с помощью функции set_time_limit(240); 240 – это время в секундах, отведенное на выполнение скрипта.
Эта статья предназначена для формирования основных понятий парсинга HTML страницы с помощью PHP. Существуют и другие библиотеки и методы парсинга. Если вы знаете таковые, поделитесь в комментариях. Буду рад, узнать какими инструментами и методами html парсинга пользуетесь вы.
Подскажите, а как осуществить перенос строки в этом коде (именно из этого урока)? Перредо мной встала задача спарсить названия статей, но им, естственно, нужен перенос. Спасибо
Всем привет, в PHP я дилетант, не могу правильно сформулировать запрос для поисковика, чтобы узнать ответы. Задача такова: 1) Есть html документ «шаблон» (h1; p; img; div и т.д.) что-то вроде карточки товара. 2) Надо из этого шаблона сделать «N» кол-во дублей страниц, но с разным содержанием (h1; p; img; div и т.д.). 3) Данные будут в txt файле. Помогите как это реализовать, дайте ссылку или подскажите как правильно спросить у поисковиков. Всем спасибо за помощь.
Роман, тебе просто нужно поискать статью о генерации уникального текста, генерация анкоров, ты сразу поймешь что в нужном месте. Например узнаешь что из одной фразы: Например: <Раскрутка|Продвижение|Оптимизация>Ваших <сайтов|ресурсов|порталов>нашими специалистами. Можно создать аж 27 уникальных фраз. =) Сорри за флуд, хотел помочь человеку.
Приветствую! Благодарю за статью, очень помогло. Но остался вопрос: Я получаю html из
Мне нужно сохранить форматирование этого куска, но убрать все ссылки, а также то, что внутри них (там может быть текст, или рисунки). Как это сделать? Спасибо.
Simple HTML DOM годится только для идеалного html кода страницы, иначе начинает жестко тупить. Другое дело phpparserplus.esy.es, который работает с помощью multi-curl и проверен на сотни сайтах.
В 5-ом Шаге вместо переменной $post необходимо использовать переменную $names, иначе описанный парсер работать не будет.
Тарас, час добрый! Нужна помощь в обучении парсингу. Буду благодарен! С уважением, Е.Андрей P.S. Описанный пример парсинга самый доходчивый. Спасибо!
Статья в стиле: «вот болт, вот гайка, вот так болт закручивается в гайку. А теперь соберем ускоритель.»
Получаю курс евро со страницы Нацбанка Беларуси. Как ему определить переменную для дальнейшего использования?
$item = $html->find(‘table#tbl td[align=right]’); только загружаете исходный код не так как описано в статье. Вот документация http://simplehtmldom.sourceforge.net/manual.htm
Тарас , добрый вечер . Не подскажете ,а возможно ли с помощью него парсить какие либо определённые строчки по маске :