PHP парсинг за допомогою Simple HTML DOM

Найчастіше для процесу парсингу використовують регулярні вирази. Але це не найкращий спосіб у зв’язку з трудомістким процесом написання та зменшення швидкості роботи програми PHP. Ми будемо використовувати бібліотеку Simple HTML DOM, за допомогою якої можна звертатися до елементів та атрибутів елементів, шукати певного рівня вкладені елементи, фільтрувати їх, шукати текст та коментарі.
Сайт підтримки: PHP Simple HTML DOM Parser. Посилання на завантаження доступне в меню "Download & Documents". В архіві містяться приклади та документація. Нам необхідно підключити файл Simple_html_dom.php, щоб працювати з функціями цієї бібліотеки.
Спочатку необхідно створити об’єкт для роботи. Дана дія може відбуватися шляхом завантаження з текстового рядка або файлу, який є URL-адресою в інтернеті:
include('simple_html_dom.php');
$html = new simple_html_dom();
// Завантаження з рядка:
$html->load('<html><body><p>Hello World!</p><p>Content</p></body></html>');
// Завантаження з файлу:
$html->load_file('http://example.com');Метод Load_file працює на використанні PHP функції File_get_contents, тому директива Allow_url_fopen має бути включена, інакше ви не зможете отримувати HTML-файли за віддаленою адресою.Якщо ви відразу побачите одну з помилок:
Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error...
Warning: file_get_contents(): Failed to enable crypto...
Warning: file_get_contents(): stream does not support seeking...
Warning: file_get_contents(): Failed to seek to position -1 in the stream...Замініть у файлі "simple_html_dom.php" реалізацію функції "file_get_contents" (для версії 1.5 - терміну №75) на:$contents = file_get_contents($url, $use_include_path, stream_context_create(array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false))));Не заглиблюватимемося в сутність даних помилок, ви просто замінюєте цей рядок і все працює.Для прикладу візьмемо найпростіший HTML документ:
$html_content = '
<html>
<body>
<h1>Заголовок</h1>
<p class="post">Вміст</p>
</body>
</html>';Створимо колекцію (групи об'єктів, знайдені за допомогою селекторів) на тег заголовка "H1". Для цього необхідно використовувати метод Find:$html = new simple_html_dom();
$html->load($html_content);
// Отримуємо масив заголовків:
$element = $html->find("h1");
echo $element[0];Для зміни інформації можна використовувати атрибут Innertext:$element[0]->innertext .= "Новий";Виконаємо додавання класу для заголовка H1:$element[0]->class = "header";Також, ми можемо вивести результат на екран:echo $html->save();Ось ми розібрали найпростіший спосіб використання бібліотеки Simple HTML DOM. Метод Find знаходить усі теги у HTML коді, і зберігає у змінній у вигляді масиву. Атрибут Innertext вносить зміни до тексту, тобто змінює весь вміст усередині вказаного тега. Атрибут Class додає певний клас до цього тегу. Метод Save зберігає зміни. Результатом виконання нашого коду буде наступний HTML документ:<html>
<body>
<h1 class="header">Заголовок Новий</h1>
<p>Вміст</p>
</body>
</html>Тепер давайте розберемо, як отримати інформацію з інших селекторів. Для цього нам необхідно в методі Find вказувати конкретнішу інформацію. Наприклад, отримати всі елементи з class="post":echo $html->find('.post');Для отримання першого елемента з class="post" необхідно додати його номер після вказання класу. Перший елемент у масиві має індекс - 0:$class = $html->find('.post', 0);Пошук може здійснюватися і у вкладених тегах, для цього необхідно вказати більш розгорнуту структуру пошуку, наприклад:echo $html->find('html body p.post', 0);Пошук заголовка, опису та ключових слів сторінки здійснюється так:$title = $html->find("title", 0)->innertext;
$descr = $html->find("meta[name=description]", 0)->attr['content'];
$keywords = $html->find("meta[name=keywords]", 0)->attr['content'];У цій статті ми описали лише основні поняття бібліотеки Simple HTML DOM. Докладніше перейдіть на сторінку Мануала. 