Парсер сайтів на Xpath. Урок 1

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

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

Xpath info

  • 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 info

Ось фактично основи 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)

Дякую за увагу ;)