Парсинг і обробка веб-сторінки на PHP: вибираємо кращу бібліотеку


Дізнайтесь більше про нові кар'єрні можливості в EchoUA. Цікаві проекти, ринкова оплата, гарний колектив. Надсилайте резюме та приєднуйтеся до нас.

Задача спарсити і обробити необхідну інформацію зі стороннього сайту постає перед веб-розробником часто і через найрізноманітніші причини: так можна заповнювати свій проект контентом, динамічно підвантажувати якусь інформацію і т. д.

У таких випадках перед програмістом постає запитання: “Яку з десятків бібліотек вибрати?”. У цій статті ми розглянемо найпопулярніші варіанти і виберемо кращий з них.

Регулярні вирази

 

Навіть не дивлячись на те, що “регулярки” – це перше, що спадає на думку, використовувати їх для справжніх проектів не варто.

Так, з простими задачами регулярні вирази справляються краще за всіх, але їх використання значно утруднюється, коли треба спарсити великий і складний фрагмент HTML-коду, який, до того ж, не завжди відповідає якомусь певному шаблону і взагалі може містити синтаксичні помилки.

Замість “допилювання” свого регулярного виразу при кожній щонайменшій зміні коду рекомендуємо використати інструменти нижче, оскільки це простіше, зручніше і надійніше.

XPath і DOM

DOM і XPath не є бібліотеками у звичному значенні цього слова, це стандартні модулі, які вбудовані в PHP починаючи з п’ятої версії. Саме відсутність необхідності використовувати сторонні рішення робить їх одними з кращих інструментів для парсингу HTML-сторінок.

На перший погляд може здатися, що низький поріг входу – це не про них, деякі місця і справді є дуже складними. Проте це тільки на перший погляд: варто трохи розібратися із синтаксисом і базовими принципами, як XPath тут же стане для Вас інструментом для парсингу № 1.

Ось, наприклад, код з використанням DOM і XPath, який шукає в розмітці всі теги

і модифікує їх атрибути src:

$dom = new DOMDocument;$dom ->loadHTML ($html);$images = $dom ->getElementsByTagName ('img');foreach ($images as $image) { $image ->setAttribute ('src', 'http://example.com/' . $image ->getAttribute ('src'));}$html = $dom ->saveHTML ();

Однак цей варіант не позбавлений мінусів – для парсингу використовується движок, у першу чергу призначений для роботи з XML, а XML і HTML хоч і є дуже схожими мовами, але все ж різняться. З цього постають специфічні вимоги до розмітки: наприклад, усі HTML-теги мають бути закритими.

Simple HTML DOM

Simple HTML DOM-PHP- бібліотека, що дозволяє парсити HTML-код за допомогою зручних jQuery-подібних селекторів.

Вона позбавлена головного недоліку XPath – бібліотека вміє працювати навіть з невалідним HTML-кодом, що значно спрощує роботу. Ви також забудете про проблеми з кодуванням: всі перетворення виконуються автоматично.

Як і JQuery, Simple HTML DOM уміє шукати і фільтрувати вкладені елементи, звертатися до їх атрибутів і навіть вибирати окремі логічні елементи коду, наприклад, коментарі.

У даному прикладі спочатку підвантажується, а потім модифікується заздалегідь заготовлений HTML-код: у другому рядку відбувається додавання атрибуту class зі значенням bar першому елементу, що потрапив, div, а в наступному рядку ми замінюємо текст елемента з id=" world" на foo.

$html = str_get_html ('
Hello
World

‘);$html ->find (‘div’, 1) ->class = ‘bar’;$html ->find (‘div[id=world]’, 0) ->innertext = ‘foo’;echo $html;

Незважаючи на не найвищу продуктивність, порівняно з іншими варіантами, Simple HTML DOM має найбільше російськомовне ком’юніті й найбільшу поширеність у рунеті – для новачків написання коду з її використанням робить значно простіше.

phpQuery

Як і Simple HTML DOM, phpQuery є PHP варіантом JQuery, але цього разу більше схожим на свого “старшого javascript-брата”.

Портировано майже все, що є в JS-фреймворці: підтримка селекторів, атрибутів, маніпуляцій, обходу, плагінів, подій (у тому числі імітації кліків і т. д.) і навіть AJAX. Використати можна як через PHP, так і через командний рядок у вигляді окремого додатка.

Більше того, згідно з нашими бенчмарками, phpQuery виявився у 8 (!) разів швидше за Simple HTML DOM.

Ось невеликий приклад на phpQuery, в якому відбувається обробка заздалегідь вибраних елементів списку (li) :

foreach (pq ('li') as $li) {
// Можна вивести різні дані звичайним текстом $tagName = $li ->tagName; $childNodes = $li ->childNodes; // А можна додати обгортку phpQuery (аналог $() в JQuery) і, наприклад, додати до елементу якийсь клас pq ($li) ->addClass ('my - second - new - class');}

Детальну документацію і більше прикладів знайдете на офіційній сторінці в Google Code.

htmlSQL

htmlSQL – експериментальна PHP-бібліотека, що дозволяє маніпулювати HTML-розміткою за допомогою SQL- подібних запитів.

Простий приклад, що витягає атрибути href і title всіх посилань (елементи a) з класом list:

SELECT href, title FROM a WHERE $class == " list"

Як і зі звичайними mysql_функціями, скориставшись методами fetch_array () або fetch_objects (), ми можемо отримати результат виконання цього запиту у вигляді звичного асоціативного масиву або об’єкта.

Варто також згадати про високу швидкодію htmlSQL: часто вона справляється у декілька разів швидше за phpQuery або того ж Simple HTML DOM.

Проте для складних задач Вам може не вистачити функціональності, а розробка бібліотеки давно припинена. Проте навіть незважаючи на це, вона все ще становить інтерес для веб-розробників: у ряді випадків зручніше використати мову SQL замість CSS-селекторів. Особливо коли Ви не знаєте, що таке CSS-селектори.

Висновок

У своєму міні-дослідженні ми дійшли висновку, що у більшості випадків для парсингу краще використати бібліотеку phpQuery: вона швидка, функціональна і сучасна.

З іншого боку, для простих задач логічно було б використати стандартні модулі PHP, такі як XPath, DOM або, регулярні вирази.

Щось ще?

Для PHP є ще десятки різноманітних бібліотек та інструментів для парсингу, але в цій статті ми розглянули тільки найцікавіші, функціональні й продуктивні.

Детальніше про інші способи парсингу засобами PHP можна прочитати у відповідній темі на StackOverflow.

Якщо Ви не використовуєте PHP, то можете ознайомиться зі стислим списком схожих інструментів для інших мов програмування:

C++: htmlcxx, libxml++;

Python: lxml, BeautifulSoup, html5lib;

Java: JSOUP, TagSoup;

Ruby: Nokogiri, Oga, Rubyful Soup;

Perl: HTML::TokeParser, HTML::Parser, HTML::SimpleParse;

.NET: Html Agility Pack;

Swift: libxml 2, Hpple;

Асемблер: AsmXml.

Київ, Харків, Одеса, Дніпро, Запоріжжя, Кривий Ріг, Вінниця, Херсон, Черкаси, Житомир, Хмельницький, Чернівці, Рівне, Івано-Франківськ, Кременчук, Тернопіль, Луцьк, Ужгород, Кам'янець-Подільський, Стрий - за статистикою саме з цих міст програмісти найбільше переїжджають працювати до Львова. А Ви розглядаєте relocate?


Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *