Підручник з XPath¶
У цій частині підручника ми наведемо вступні зауваження щодо XPath, мови запитів, якою можна скористатися для вибору довільних частин документів HTML у calibre. XPath є широковживаним стандартом, отже, пошук у мережі надасть вам дуже багато інформації щодо неї. Втім, увагу у цій частині підручника зосереджено на використанні XPath для завдань, пов’язаних із електронними книгами, зокрема пошуку заголовків глав у неструктурованому документі HTML.
Вибір за назвою теґу¶
Найпростішою формою вибору є вибір теґів за назвою. Наприклад, припустімо, що вам хочеться вибрати усі теґи <h2>
у документі. Запит XPath для цього буде дуже простим:
//h:h2 (Selects all <h2> tags)
Префікс «//» означає шукати на усіх рівнях документа. Тепер, припустімо, що ви хочете знайти теґи <span>
, які перебувають всередині теґів <a>
. Зробити це можна ось так:
//h:a/h:span (Selects <span> tags inside <a> tags)
Якщо ви хочете шукати теґи на певному рівні у документі, змініть префікс:
/h:body/h:div/h:p (Selects <p> tags that are children of <div> tags that are
children of the <body> tag)
Буде знайдено лише <p>A very short ebook to demonstrate the use of XPath.</p>
у Зразок книги, але не буде знайдено жодного іншого теґу <p>
. Префікс h:
у наведених вище прикладах потрібен для встановлення відповідності теґам XHTML. Він потрібен, тому що на внутрішньому рівні calibre представляє усі дані як XHTML. У теґів XHTML є власний простір назв, і h:
є префіксом простору назв для теґів HTML.
Тепер, припустімо, вам потрібно вибрати одразу теґи <h1>
і теґи <h2>
. Для виконання цього завдання нам знадобиться конструкція XPath, яка називається предикатом. предикат є простою перевіркою, яка використовується для вибору теґів. Перевірки можуть мати довільну потужність. У межах цього розділу ми наведемо і потужніші приклади. Предикат створюється взяттям виразу перевірки у квадратні дужки:
//*[name()='h1' or name()='h2']
У цьому виразі XPath є декілька нових особливостей. Першою є використання замінника *
. Цей замінник означає знайти будь-який теґ. Далі, зверніть увагу на вираз перевірки name()='h1' or name()='h2'
. name() є прикладом вбудованої функції. Ця функція просто повертає назву теґу. Отже, за її допомогою ми можемо вибрати теґи, назвами яких є h1 або h2. Зауважте, що функція name() ігнорує простори назв, отже, у додаванні префікса h:
немає потреби. У XPath є декілька корисних вбудованих функцій. Ще декілька буде представлено у цьому розділі.
Вибір за атрибутами¶
Для вибору тегу на основі його атрибутів слід користуватися предикатами:
//*[@style] (Select all tags that have a style attribute)
//*[@class="chapter"] (Select all tags that have class="chapter")
//h:h1[@class="bookTitle"] (Select all h1 tags that have class="bookTitle")
Тут оператор @
посилається на атрибути теґу. Ви можете скористатися деякими з вбудованих функцій XPath для встановлення складних відповідностей із значеннями атрибутів.
Вибір за вмістом теґу¶
За допомогою XPath ви навіть можете вибирати теґи на основі тексту, який у них міститься. Найкращим способом це зробити є використання потужності формальних виразів, тобто вбудованої функції re:test():
//h:h2[re:test(., 'chapter|section', 'i')] (Selects <h2> tags that contain the words chapter or
section)
Тут оператор .
посилається на вміст теґу, так само, як оператор @
посилається на його атрибути.
Зразок книги¶
<html>
<head>
<title>A very short e-book</title>
<meta name="charset" value="utf-8" />
</head>
<body>
<h1 class="bookTitle">A very short e-book</h1>
<p style="text-align:right">Written by Kovid Goyal</p>
<div class="introduction">
<p>A very short e-book to demonstrate the use of XPath.</p>
</div>
<h2 class="chapter">Chapter One</h2>
<p>This is a truly fascinating chapter.</p>
<h2 class="chapter">Chapter Two</h2>
<p>A worthy continuation of a fine tradition.</p>
</body>
</html>
Вбудовані функції XPath¶
- name()¶
Назва поточного теґу.
- contains()¶
contains(s1, s2)
повертає «true», якщо s1 містить s2.- re:test()¶
re:test(джерело, взірець, прапорці)
повертає true, якщо рядок джерело відповідає формальному виразу взірець. Одним із особливо корисних прапорців єi
, прапорець, який вимикає врахування регістру символів під час порівняння. Чудовий підручник із синтаксису формальних виразів можна знайти на сторінці синтаксису формальних виразів