4.2 Послідовність селекторності з API Selectable

Вибір релевантної послідовності API Selectable для селекторів - це основна функція WebMagic. Для використання інтерфейсу селекторності (селективного вибору для екстракції) можна використати пряму послідовність доступу до елементів сторінки та потрібно подбати про уточнюючи деталі.

З попереднього прикладу можна побачити, що page.getHtml() повертає об'єкт Html, який імплементує інтерфейс Selectable. Цей інтерфейс містить декілька важливих частин. Я розділив його на дві категорії: розтин на частини для екстракції і повернення отриманих результатів.

Селектори для екстракції (починаючи з API v.4.2.1):

метод опис приклади
xpath(String xpath) використання XPath селектора html.xpath("//div[@class='title']")
$(String selector) використання CSS селектора для вибору html.$("div.title")
$(String selector, String attr) використання CSS селектора для вибору html.$("div.title","text")
css(String selector) аналогічно функції з $(), використання CSS селектора для вибору html.css("div.title")
links() вибрати усі лінки html.links()
regex(String regex) використати регулярний вираз для екстракції html.regex("\(.\*?)\")
regex(String regex, int group) використати регулярний вираз для екстракції та вказати порядковий номер групи для обробки html.regex("\(.\*?)\",1)
replace(String regex, String replacement) замінити вміст за regex на replacement html.replace("\","")

Це є частиною процесу екстракцюї, відпрацьовує та повертає результат через інтерфейс API Selectable, що означає - послідовність безперервної черги викликів для екстракції. Приклад використання послідовності API.

Припустимо зараз я хочу охопити та зібрати (екстрактувати) всі проекти Java на GitHub, ці елементи можна побачити https://github.com/search?l=Java&p=1&q=stars%3A%3E1&s=stars&type=Repositories - це наведені результати пошуку.

Щоб уникнути занадто широкого сканування, я вказав обмеження - сканувати лише посилання з секції закладок сторінок (пейджинатора). Напевно писати правила обходу усьго контенту складніше булоб?

selectable-chain-ui

Спочатку розглянемо типову структуру HTML сторінки:

selectable-chain

Видно, що можна використовувати CSS селектори, щоб екстрактувати (витягти) цей тег <div>, а потім там взяти всі посилання. Щоб перестрахуватися застосуэмо відбір регулярним виразом. Таким чином формат витягнутого - це URL за нашим шаблоном. У підсумку остаточне формулювання виглядає так:

List<String> urls = page.getHtml().css("div.pagination").links().regex(".*/search/\?l=java.*").all();

Тоді ми можемо додати ці URL-и до списку для сканування:

List<String> urls = page.getHtml().css("div.pagination").links().regex(".*/search/\?l=java.*").all();
page.addTargetRequests(urls);

Це ж справді не складно? На додаток для пошуку посилань-лінків, використання API Selectable послідовності селекторної екстракції - також може зробити багато роботи. У розділі 9 TODO ми знову будемо розбирати наведені вище приклади.

4.2.2 Get Results API для отримання результатів:

Коли викликаємо послідовності, ми звичайно очікуємо отримати у результаті тип String. За для цього використовуємо Get Results API. Ми вже знайомі з правилами екстакції XPath та CSS селектори або регулярний вираз regex, за якими завжди можна витягти декілька елементів. У WebMagic вони були уніфіковані, тому ви можете отримати один або кілька елементів за допомогою різних API.

метод опис приклади
get() повертає результат типу String String link= html.links().get()
toString() функція get(), повертає результат типу String String link= html.links().toString()
all() повертає всі результати вилучення List links= html.links().all()
match() якщо результат співпадає if (html.links().match()){ xxx; }

Наприклад, у випадках коли ми точно знаємо, що сторінка буде мати результат, тоді можна використовувати selectable.get() або selectable.toString() для отримання цього результату.

У цьому випадку selectable.toString() використовує toString() цього інтерфейсу, це добре для системи виведення та фреймворків при інших комбінаціях, більш зручними. Тому що при нормальних обставинах, нам потрібно тільки вибрати один елемент!

selectable.all() - у результаті отримаєте всі елементів.

Ну а тепер, якщо озирнутися назад на GithubRepoPageProcessor у Частину 4.1 Імплементація PageProcessor, можливо ви вже відчуватимете себе більш ясно, чи не так? Переписати специфікацію main() метода, і тоді вже можна побачити оновлені результати роботи пошукача у виводу в консолі.

results matching ""

    No results matching ""