Всім хай. Кожному програмісту доводилось викачувати інформацію з сайтів. Сьогодні я почну цикл уроків про те як написати хороший парсер за мінімальний час. Бібліотеки які будуть розглянуті в цих уроках є самописні, особисто я використовую їх не тільки для отримання інформації а і для відправлення. Тобто це ніщо інше як роботи. Почнемо з того як найкраще витягувати інформацію з сайту за допомогою Xpath.

XPath  - XML Path Language. Для того що б не передруковувати вікіпедію напишу що XPath - це шлях до елементу. Тобто для того що б нам витягнути певний елемент з документу XML чи HTML нам треба знати де він знаходиться. Деякі факти про XPath

  • XPath - вираз який визначає частини документу XML
  • XPath - використовує опис шляху для навігації в XML документі
  • XPath - бібліотека яка включає стандартні функції
  • XPath - основний елемент в XSLT
  • XPath - стандартизований W3C

Ви не повірите, але перша версія XPath появилась в 1999 році. WAT???. На даний час затверджено XPath версії 2.0 Інші дані про XPath ви зможете знайти на вікіпедії а також на сайті W3C.

Перейдемо до прикладів і чому XPath краще в деяких випадках ніж регулярні вирази, на мою думку.

Для прикладу нам необхідно отримати всі посилання на сторінці.

Вираз буде наступний.

//a

а - означає імя тегу. Всі ми знаємо що а - це посилання :) 

// - два слеші з початку означають що ми шукаємо посилання на будь-якому рівні документу.

В XPath ми працюємо з семантикою документа. Отже, є відносні й абсолютні шляхи. 

Деякі прості приклади:

  • Отримуємо всі посилання які розміщені в параграфі:
//p/a
  • Отримуємо перший параграф
//p[1]
  • Отримуємо останній параграф
//p[last()]
  • Отримуємо всі елементи
//*

Як на мене за допомогою простого виразу XPath можна легко маніпулювати документом. Тобто Вам не потрібно писати багато РНР коду для того що б отримати останнє посилання в абзаці. 

Як дізнатись шлях до елементу? Це дуже просто :) У всіх нормальних бравзерах є панель розробника там все написано. В самому низу і вказано шлях до елементу. Звісно писати повний шлях це маразм, а от вказати 2-3 параметра цілком логічно. Все залежить від структури документу.

Ось фактично основи XPath. Давайте тепер розглянемо як нам реально працювати з даними. 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$doc = new DOMDocument();
# завантажуємо нашу сторінку 
$doc->loadHTMLFile('http://funivan.com/');
$xpath = new DOMXpath($doc); 
# отримуємо всі ноди які є в документі
$elements = $xpath->query("*");
foreach ($elements as $element) {
    # Виводимо назву тегу
    echo $element->nodeName . '/<br>';
}

Ще декілька прикладів

xpathопис
/*Вибираємо всі елементи першого рівня
//*[name() != 'a']Вибираємо всі елементи крім посилань
//div[@class='text']//a"Вибираємо всі посилання у divi з класом text
//*[*]"Вибираємо всі елементи у яких є хоча б 1н дочірній елемент
//*[not(*)]"Вибираємо всі елементи у яких немає дочірніх елементів

Для початку достатньо, не буду Вас сильно навантажувати. В інтернеті багато інформації про Xpath. Якщо щось не зрозуміло або просто є запитання та побажання пишіть коментарі =)

Наступний урок буде про функції в xpath. (Урок 2)

Ще через один покажу свій клас для xpath і опишу як в 3 рядки можна отримати все що хочеш із сторінки. (Урок 3)

Дякую за увагу. Погнали кодити ;)