
Всім хай. Кожному програмісту доводилось викачувати інформацію з сайтів. Сьогодні я почну цикл уроків про те як написати хороший парсер за мінімальний час. Бібліотеки які будуть розглянуті в цих уроках є самописні, особисто я використовую їх не тільки для отримання інформації а і для відправлення. Тобто це ніщо інше як роботи. Почнемо з того як найкраще витягувати інформацію з сайту за допомогою Xpath.
XPath - XML Path Language. Для того що б не передруковувати вікіпедію напишу що XPath - це шлях до елементу. Тобто для того що б нам витягнути певний елемент з документу XML чи HTML нам треба знати де він знаходиться. Деякі факти про XPath
- XPath - вираз який визначає частини документу XML
- XPath - використовує опис шляху для навігації в XML документі
- XPath - бібліотека яка включає стандартні функції
- XPath - основний елемент в XSLT
- XPath - стандартизований W3C
Ви не повірите але перша версія XPath появилась в 1999 році. На даний час затверджено XPath версії 2.0 Інші дані про XPath ви зможете знайти на вікіпедії і на сайті W3C. Перейдемо до прикладів і чому XPath краще в деяких випадках ніж регулярні вирази, на мою думку.
Давайте розглянемо приклади XPath.
Для прикладу нам необхідно отримати всі посилання на сторінці. Вираз буде наступний.
//a
а - означає імя тегу. Всі ми знаємо що а - це посилання :)
// - два слеші з початку означають що ми шукаємо посилання на будь якому рівні документу. Відносний шлях.
В XPath ми працюємо з семантикою документа. Отже є відносні і абсолютні шляхи.
Деякі прості приклади:
• Отримуємо всі посилання які розміщені в параграфі://p/a
• Отримуємо перший параграф
//p[1]
• Отримуємо останній параграф
//p[last()]
• Отримуємо всі елементи
//*
Як на мене за допомогою простого виразу XPath можна легко маніпулювати документом. Тобто Вам не потрібно писати багато РНР коду для того що б отримати останнє посилання в абзаці.
Як дізнатись шлях до елементу? Це дуже просто :) У всіх нормальних бравзерах є панель розробника там все написано.
Клікність на картину. В самому низу і вказано шлях до елементу. Звісно писати повний шлях це маразм а от вказати 2-3 параметра цілком логічно. Все залежить від структури документу.
Ось фактично основи XPath. Давайте тепер розглянемо як нам реально працювати з даними.
$doc = new DOMDocument(); # загружаємо нашу сторінку $doc->loadHTMLFile('http://funivan.com/'); $xpath = new DOMXpath($doc); # отримуємо елементи (ноди) $elements = $xpath->query("//*[@class='cat-item']/a"); foreach ($elements as $element) { # Виводим назву тегу echo '
' . $element->nodeName . ' > '; # Виводимо значення echo $element->nodeValue . '
'; }
Ще декілька прикладів
// Вибираємо всі елементи першого рівня "/*" // Вибираємо всі елементи крім посилань "//*[name() != 'a']" // Вибираємо всі посилання у divi з класом text "//div[@class='text']//a" // Вибираємо всі елементи у яких є хоча б 1н дочірній елемент "//*[*]" // Вибираємо всі елементи у яких немає дочірніх елементів "//*[not(*)]"
Для початку достатньо, не буду Вас сильно навантажувати. В інтернеті багато інформації про Xpath. Якщо щось не зрозуміло або просто є запитання та побажання пишіть коментарі =)
Наступний урок буде про функції в xpath. (Урок 2)
Ще через один покажу свій клас для xpath і опишу як в 3 рядки можна отримати все що хочеш із сторінки. (Урок 3)
Дякую за увагу ;)