Scrapy

Scrapy с селекторами XPath

Scrapy с селекторами XPath
HTML - это язык веб-страниц, и между открытием и закрытием каждой веб-страницы висит много информации html тег. Есть много способов получить к нему доступ, однако в этой статье мы будем делать это с помощью селектора Xpath через библиотеку Python Scrapy.

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

В этом руководстве рассматривается использование селекторов Xpath. Xpath использует синтаксис типа path для навигации по узлам XML-документов. Они также полезны при навигации по тегам HTML.

В отличие от учебника Scrapy, для простоты мы собираемся выполнять все наши операции здесь, на терминале. Это не означает, что Xpath нельзя использовать с правильной программой Scrapy, однако их можно использовать в библиотеке синтаксического анализа в параметре ответа.

Мы собираемся работать с примером.веб-сканирование.com, так как он очень прост и поможет понять концепции.

Чтобы использовать scrapy в нашем терминале, введите команду ниже:

Оболочка $ scrapy http: // пример.веб-сканирование.ком

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

В 1]:

В интерактивном сеансе мы будем работать с отклик объект.

Вот как наш синтаксис будет выглядеть в большей части этой статьи:

В [1]: ответ.xpath ('xpathsyntax').извлекать()

Эта команда выше используется для извлечения всех совпавших тегов в соответствии с синтаксисом Xpath и затем сохраняет их в списке.

В [2]: ответ.xpath ('xpathsyntax').extract_first ()

Эта команда выше используется для извлечения только первого совпавшего тега и сохранения его в списке.
Теперь мы можем начать работу над синтаксисом Xpath.

НАВИГАЦИОННЫЕ МЕТКИ

Навигация по тегам в Xpath очень проста, все, что требуется, это косая черта «/», за которой следует имя тега.

В [3]: ответ.xpath ('/ html').извлекать()

Приведенная выше команда вернет html тег и все, что он содержит, как один элемент в списке.

Если мы хотим получить тело веб-страницы, мы должны использовать следующее:

В [4]: ​​ответ.xpath ('/ html / body').извлекать()

Xpath также позволяет использовать подстановочный знак «*», который соответствует всему на уровне, на котором он используется.

В [5]: ответ.xpath ('/ *').извлекать()

Приведенный выше код будет соответствовать всему в документе. То же самое происходит, когда мы используем '/ html'.

В [6]: ответ.xpath ('/ html / *').извлекать()

Помимо навигации по тегам, мы можем получить все дочерние теги определенного тега с помощью символа «//».

В [7]: ответ.xpath ('/ html // a').извлекать()

Приведенный выше код вернет все теги привязки в теге html i.е. он вернет список всех дочерних тегов привязки.

ТЭГИ ПО АТРИБУТАМ И ИХ ЗНАЧЕНИЯМ

Иногда переход по тегам html для перехода к нужному тегу может вызывать проблемы. Эту проблему можно избежать, просто найдя нужный тег по его атрибуту.

В [8]: ответ.xpath ('/ html // div [@id = "разбивка на страницы"]').извлекать()

Приведенный выше код возвращает все div теги под html тег, имеющий я бы атрибут со значением разбивка на страницы.

В [9]: ответ.xpath ('/ html // div [@class = "span12"]').извлекать()

Приведенный выше код вернет список всех div теги под тегом html, только если они имеют атрибут класса со значением span12.

Что делать, если вы не знаете значение атрибута? И все, что вам нужно, это получить теги с определенным атрибутом, не заботясь о его значении. Сделать это тоже просто, все, что вам нужно сделать, это использовать только символ @ и атрибут.

В [10]: ответ.xpath ('/ html // div [@class]').извлекать()

Этот код вернет список всех тегов div, содержащих атрибут класса, независимо от того, какое значение содержит этот атрибут класса.

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

В [11]: ответ.xpath ('/ html // div [содержит (@id, "ion")]').извлекать()

Приведенный выше код вернет все теги div под тегом html, которые имеют атрибут id, однако мы не знаем, какое значение имеет атрибут, за исключением того, что мы знаем, что он содержит «ion».

Страница, которую мы анализируем, имеет только один тег в этой категории, и значение - «разбиение на страницы», поэтому он будет возвращен.

Круто, правда?

ТЕГИ ПО ИХ ТЕКСТУ

Помните, что ранее мы сопоставляли теги по их атрибутам. Мы также можем сопоставлять теги по их тексту.

В [12]: ответ.xpath ('/ html // a [.= "Алжир"] ').извлекать()

Приведенный выше код поможет нам получить все теги привязки, в которых есть текст «Алжир». NB: это должны быть теги именно с таким текстовым содержанием.

Замечательный.

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

В [13]: ответ.xpath ('/ html // a [содержит (text (), "A")]').извлекать()

Приведенный выше код получит теги, в текстовом содержании которых есть буква «А».

ИЗВЛЕЧЕНИЕ СОДЕРЖАНИЯ ТЕГОВ

Все время мы говорили о поиске правильных тегов. Пришло время извлечь содержимое тега, когда мы его найдем.

Это довольно просто. Все, что нам нужно сделать, это добавить к синтаксису «/ text ()», и содержимое тега будет извлечено.

В [14]: ответ.xpath ('/ html // а / текст ()').извлекать()

Приведенный выше код получит все теги привязки в html-документе, а затем извлечет текстовое содержимое.

ИЗВЛЕЧЕНИЕ ССЫЛКИ

Теперь, когда мы знаем, как извлекать текст в тегах, мы должны знать, как извлекать значения атрибутов. Чаще всего значения атрибутов, которые имеют для нас первостепенное значение, являются ссылками.

Это почти то же самое, что извлечение текстовых значений, однако вместо использования «/ text ()» мы будем использовать символ «/ @» и имя атрибута.

В [15]: ответ.xpath ('/ html // a / @ href').извлекать()

Приведенный выше код извлечет все ссылки в тегах привязки, ссылки должны быть значениями href атрибут.

НАВИГАЦИЯ ПО БРАКАМ

Если вы заметили, все это время мы перемещались по тегам. Однако есть одна ситуация, которую мы не рассмотрели.

Как выбрать конкретный тег, если теги с одинаковым именем находятся на одном уровне?




Афганистан




Аландские острова


В случае, подобном тому, который у нас есть выше, если мы хотим взглянуть на это, мы могли бы сказать, что использовали бы extract_first () чтобы получить первое совпадение.

Однако что, если мы хотим сопоставить второй? Что делать, если вариантов больше десяти, а нам нужен пятый? Мы ответим на это прямо сейчас.

Вот решение: когда мы пишем наш синтаксис Xpath, мы помещаем позицию нужного тега в квадратные скобки, точно так же, как мы индексируем, но индекс начинается с 1.

Глядя на html веб-страницы, с которой мы имеем дело, можно заметить, что там много теги на одном уровне. Чтобы получить третий тег, мы бы использовали следующий код:

В [16]: ответ.xpath ('/ html // tr [3]').извлекать()

Вы также заметили, что теги по два, если нам нужен только второй теги из row мы бы сделали следующее:

В [17]: ответ.xpath ('/ html // td [2]').извлекать()

ЗАКЛЮЧЕНИЕ:

Xpath - очень мощный способ синтаксического анализа html-файлов, который может помочь свести к минимуму использование регулярных выражений при их синтаксическом анализе, учитывая, что он имеет содержит функция в ее синтаксисе.

Существуют и другие библиотеки, которые позволяют анализировать с помощью Xpath, например Selenium для веб-автоматизации. Xpath дает нам множество вариантов при синтаксическом анализе html, но то, что было рассмотрено в этой статье, должно помочь вам в распространенных операциях синтаксического анализа html.

Как использовать Xdotool для стимулирования щелчков мыши и нажатия клавиш в Linux
Xdotool - это бесплатный инструмент командной строки с открытым исходным кодом для имитации щелчков мыши и нажатия клавиш. В этой статье будет краткое...
5 лучших эргономичных компьютерных мышей для Linux
Вызывает ли длительное использование компьютера боль в запястье или пальцах?? Вы страдаете от скованности суставов и постоянно должны пожимать руки? В...
Как изменить настройки мыши и сенсорной панели с помощью Xinput в Linux
Большинство дистрибутивов Linux по умолчанию поставляются с библиотекой libinput для обработки событий ввода в системе. Он может обрабатывать события ...