Программа grab для чего

Ваше приложение Everyday Everything в Юго-Восточной Азии.

Последняя версия

30 мая 2023 г.
Разработчик
Google Play ID
Количество установок
100 000 000+

App APKs

Grab APK 掴む APK

Grab APP

Получите все, что вам нужно, с помощью Grab — ведущего приложения для такси, доставки еды и продуктов в Юго-Восточной Азии.

Grab — новый интерфейс для работы с DOM-деревом HTML-документа

Ранее я уже писал на хабре о Grab — фреймворке для написания парсеров сайтов: раз, два, три, четыре. В двух словах, Grab это удобная оболочка поверх двух библиотек: pycurl для работы с сетью и lxml для разбора HTML-документов.

Библиотека lxml позволяет совершать XPATH-запросы к DOM-дереву и получать результаты в виде ElementTree объектов, имеющих кучу полезных свойств. Несколько лет назад я разработал несколько простых методов, которые позволяли применять xpath-запросы к документу, загруженному через граб. Проиллюстрирую кодом:

>>> from grab import Grab >>> g = Grab() >>> g.go(‘http://habrahabr.ru/’) >>> print g.xpath_text(‘//title’) Лучшие за сутки / Посты / Хабрахабр

По сути это аналогично следующему коду:

бесплатная Программа выдиратель печатей Grab stamp


>>> from urllib import urlopen >>> from lxml.html import fromstring >>> data = urlopen(‘http://habrahabr.ru/’).read() >>> dom = fromstring(data) >>> print dom.xpath(‘//title’)[0].text_content() Лучшие за сутки / Посты / Хабрахабр

Удобство метода xpath_text заключается в том, что он автоматически применяется к загруженному через Grab документу, не нужно строить дерево, это делается автоматически, также не нужно вручную выбирать первый элемент, метод xpath_text делает это автоматически, также этот метод автоматически извлекает текст из всех вложенных элементов. Далее я привожу все методы библиотеки Grab с их кратким описанием:

  • grab.xpath — вернуть первый элемент, удовлетворящий условию
  • grab.xpath_list — вернуть все элементы
  • grab.xpath_text — взять первый элемент, удовлетворяющий условию и извлечь из него текстовое содержимое, также позволяет задать default значение, возвращаемое, если элемент не найден
  • grab.xpath_number — взять результат grab.xpath_text и найти в нём число
Читайте также:
Bootice что это за программа и нужна ли она

Не обошлось и без конфузов. Метод grab.xpath — возвращает первый элемент выборки, в то время как метод xpath ElementTree объекта возвращает весь список. Народ неоднократно натыкался на эту граблю. Также хочу заметить, что был точно такой же набор методов для работы с css запросами т.е. grab.css, grab.css_list, grab.css_text и т.д., но я лично отказался от CSS-выражений в пользу XPATH т.к. XPATH более мощный инструмент и часто есть смысл использовать его и я не хотел видеть в коде мешанину из CSS и XPATH выражений.

У вышеописанных методов был ряд недостатков:

Во-первых, когда требовалось вынести код выборки элементов в отдельную функцию, то возникал соблазн передавать в неё весь Grab объект, чтобы вызывать от него эти функции. По другому никак: или передаем Grab объект или передаём голый DOM-объект, у которого нет полезных функций, типа xpath_text.

Приложением Grab Taxi — как пользоваться в Аэропорту Хошимина

Во-вторых, результат работы функций grab.xpath и grab.xpath_list — это голые ElementTree элементы, у которых уже нету методов типа xpath_text.

В-третьих, хотя это скорее проблема расширений фреймворка, но, так или иначе, область имён объекта Grab засоряется множеством вышеописанных методов.

А, да, и четвёртое. Меня заколебали вопросом о том, как получить HTML код элементов, найденных с помощью методов grab.xpath и grab.xpath_list. Народ не хотел понимать, что grab это просто обёртка вокруг lxml и что нужно просто прочитать мануал на lxml.de

Новый интерфейс для работы с DOM-деревом призван устранить эти недостатки. Если вы пользуетесь фреймворком Scrapy, то нижеописанные вещи будут вам уже знакомы. Я хочу рассказать о селекторах.

Селекторы

Селекторы, что это? Это обёртки вокруг ElementTree элементов. Изначальное в обёртку заворачивается всё DOM дерево документа т.е. обёртка строится вокруг корневого html элемента. Далее мы можем с помощью метода select получить список элементов, удовлетворяющих XPATH выражению и каждый такой элемент будет опять завёрнут в Selector обёртку.

Читайте также:
Погода что это за программа на Андроид

Давайте посмотрим, что мы можем делать с помощью селекторов. Для начала сконструируем селектор

  • Item 1
  • item 2

Теперь сделаем выборку методом select, получим список новых селекторов. Мы можем обращаться к нужному селектору по индексу, также есть метод one() для выбора первого селектора. Обратите внимание, чтобы получить доступ непосредственно к ElementTree элементу, нам нужно обратиться к атрибуту node у любого селектора.

>>> root.select(‘//ul’) >>> root.select(‘//ul’)[0] >>> root.select(‘//ul’)[0].node >>> root.select(‘//ul’).one()

Какие действия доступны над найденными селекторами? Мы можем извлечь текстовое содержимое, попытаться найти числовое содержимое и даже применить регулярное выражение.

>>> root.select(‘//ul/li’)[0].text() ‘Item 1’ >>> root.select(‘//ul/li’)[0].number() 1 >>> root.select(‘//ul/li/text()’)[0].rex(‘(w+)’).text() ‘Item’

Обратите внимание, мы используем индекс, чтобы обращаться к первому найденному селектору. Все эти записи можно сократить, не указывая индекс, тогда, по-умолчанию, будет использоваться первый найденный селектор.

>>> root.select(‘//ul/li’).text() ‘Item 1’ >>> root.select(‘//ul/li’).number() 1 >>> root.select(‘//ul/li/text()’).rex(’em (d+)’).text() ‘1’ >>> root.select(‘//ul/li/text()’).rex(’em (d+)’).number() 1

Что ещё? Метод html для получения HTML-кода селектора, метод exists для проверки существования селектора. Также вы можете вызывать метод селект у любого селектора.

>>> root.select(‘//span’)[0].html() u’green’ >>> root.select(‘//span’).exists() True >>> root.select(‘//god’).exists() False >>> root.select(‘//ul’)[0].select(‘./li[3]’).text() ‘item 2’

Как работать с селектором непосредственно из Grab объекта? C помощью аттрибута doc вы можете получить доступ к корневому селектору DOM-дерева и далее использовать метод select для нужной выборки:

Текущая реализация селекторов в Grab ещё достаточно сырая, но понять и оценить новый интерфейс, я думаю уже можно.

В версии Grab, доступной через pypi селекторов пока нет. Если хотите поиграться с селекторами, ставьте Grab из репозитория: bitbucket.org/lorien/grab. Конкретно реализация селекторов находится тут

Я представляю компанию GrabLab — мы занимаемся парсингом сайтов, парсим с помощью Grab и не только. Если ваша компания использует Grab, вы можете обращаться к нам по поводу доработки Grab под ваши нужды.

Читайте также:
Программа les mills что это такое

Источник: habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru