перейти к содержанию

Как выбирать элементы по классу в XPath: полное руководство

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

В этом подробном руководстве мы подробно рассмотрим, как выбирать элементы по классу с помощью XPath. Независимо от того, являетесь ли вы новичком или опытным парсером веб-страниц, к концу этой статьи вы будете умело ориентироваться в HTML-документах и ​​точно находить нужные элементы. Давайте начнем!

Краткий обзор XPath

Прежде чем мы углубимся в селекторы классов, давайте кратко рассмотрим, что такое XPath и как он работает. XPath — это язык запросов, используемый для навигации и выбора узлов в документе XML или HTML. Он позволяет вам писать выражения, которые определяют конкретные элементы на основе их имени тега, атрибутов, положения и т. д.

Вот несколько важных вещей, которые нужно знать о XPath:

  • XPath рассматривает документ как древовидную структуру с корневым узлом и ответвлениями дочерних узлов.
  • Выражения оцениваются слева направо
  • Косая черта (/) используется для навигации между узлами.
  • Элементы можно выбирать по их имени (например, //div выбирает все <div> элементы)
  • Предикаты в квадратных скобках позволяют сделать более точный выбор (например, //div[@id=‘main‘] выбирает <div> элементы с идентификатором «main»)

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

Понимание классов HTML

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

Вот пример элемента абзаца с двумя классами:

<p class="highlight text-center">This is some text.</p>

В этом случае <p> К элементу применены два класса: «highlight» и «text-center». Элемент может иметь любое количество классов, которые разделены пробелами в значении атрибута класса.

Следует иметь в виду, что имена классов чувствительны к регистру. Так class="highlight" и class="Highlight" будут считаться двумя разными классами.

Теперь, когда мы понимаем, что такое классы HTML, давайте посмотрим, как мы можем выбирать элементы на основе их классов с помощью XPath.

Выбор элементов по классу в XPath

XPath предоставляет два основных способа выбора элементов по атрибуту класса:

  1. Использование функции содержит()
  2. Точное соответствие имени класса

Давайте рассмотрим каждый из этих подходов более подробно.

Подход 1. Использование функции contains()

Ассоциация contains() функция позволяет выбирать элементы, атрибут класса которых содержит определенное имя класса. Вот основной синтаксис:

//element[contains(@class,‘classname‘)]

Например, чтобы выбрать все <div> элементы, имеющие класс «контейнер», вы должны использовать:

//div[contains(@class,‘container‘)]  

Ассоциация contains() Функция имеет несколько ключевых характеристик:

  • Он чувствителен к регистру (поэтому «контейнер» и «Контейнер» будут рассматриваться как разные)
  • Имя класса может появляться в любом месте значения атрибута класса.
  • К элементу также могут применяться другие классы, если он содержит указанный класс.

So contains(@class,‘container‘) будет соответствовать таким элементам, как:

<div class="container"></div>
<div class="wrapper container card"></div>
<div class="container highlighted"></div>

Но это не игра:

<div class="containery"></div>
<div class="wrapper"></div>

Ассоциация contains() подход универсален и может быть хорошим выбором, если вы хотите сопоставить элементы, имеющие определенный класс, как часть набор классов. Но если вам нужно быть более точным, следующий подход может быть предпочтительнее.

Подход 2: точное соответствие имени класса

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

//element[@class=‘classname‘]

Например, чтобы выбрать <p> элементы, где класс точно "выделен", вы должны использовать:

//p[@class=‘highlight‘]

Это выражение будет соответствовать:

<p class="highlight"></p>  

Но нет:

<p class="highlight text-center"></p>
<p class="highlights"></p>
<p class="Highlight"></p>

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

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

XPath и классы – ключевые соображения

При использовании XPath для выбора элементов по классу следует учитывать несколько важных вещей:

  • Имена классов чувствительны к регистру. Как упоминалось ранее, «highlight» и «Highlight» рассматриваются как отдельные имена классов. Убедитесь, что ваши выражения XPath точно соответствуют регистру.

  • Элементы могут иметь несколько классов. Очень часто к элементам применяется более одного класса, разделенного пробелами. contains() подход будет сопоставлять элементы, если они содержат указанный класс где-то в их атрибуте класса.

  • Точное соответствие является более точным, но менее гибким. Если вы используете [@class=‘classname‘], атрибут класса должен только содержать этот класс. Если применяются другие классы, элемент не будет сопоставлен. В отличие, contains(@class,‘classname‘) будет соответствовать, пока класс присутствует где-то в значении атрибута.

  • XPath поддерживается большинством инструментов и библиотек для парсинга веб-страниц. Независимо от того, используете ли вы Python с BeautifulSoup или Scrapy, JavaScript с Puppeteer или Cheerio или другой язык/платформу, вы, скорее всего, сможете использовать выражения XPath для извлечения данных. Синтаксис выбора класса остается прежним.

  • Производительность имеет значение для крупномасштабного парсинга. Хотя XPath очень мощный инструмент, он также может быть медленнее, чем другие методы, такие как селекторы CSS, особенно для более сложных выражений. Если вы очищаете большое количество страниц, стоит сравнить различные подходы, чтобы определить, какой из них дает наилучшую производительность.

Лучшие практики и советы по выбору классов

Чтобы получить максимальную отдачу от селекторов классов XPath, примите во внимание следующие рекомендации и советы:

  • Используйте самое простое выражение, которое выполнит задачу. Иногда простой //element[@class=‘classname‘] это все, что тебе нужно. Избегайте ненужной сложности.

  • При необходимости комбинируйте селекторы классов с другими критериями. Вы можете использовать предикаты для выбора элементов на основе нескольких атрибутов (например, //button[@class=‘primary‘ and @type=‘submit‘]) или комбинируйте селекторы классов с позиционными селекторами (например, (//div[@class=‘row‘])[2] для выбора второй строки).

  • Помните об изменениях в HTML-коде сайта. Классы часто используются для стилизации, а это означает, что они могут изменяться чаще, чем другие атрибуты, такие как идентификаторы. Если ваш парсер сломался, дважды проверьте, присутствуют ли на странице классы, на которые вы ориентируетесь.

  • Используйте относительные XPath, чтобы избежать повторения длинных выражений. Если вы уже выбрали родительский элемент, вы можете использовать точку (.), чтобы выбрать дочерние элементы относительно этого элемента, например //div[@class=‘container‘]/./p.

  • Рассмотрите другие методы, такие как селекторы CSS или регулярные выражения, для конкретных случаев использования. Хотя XPath универсален, могут быть случаи, когда другой подход будет проще или быстрее. Селекторы CSS эффективны и хорошо подходят для основных задач выбора. Регулярные выражения могут быть полезны для сопоставления с образцом или извлечения данных из текстового содержимого.

Примеры выбора класса

Давайте рассмотрим несколько примеров выбора классов в действии с использованием Python и lxml библиотека.

Предположим, у нас есть этот HTML:

<html>
    <body>
        <div class="container">
            <p class="highlight">Paragraph 1</p>
            <p>Paragraph 2</p>
            <p class="highlight">Paragraph 3</p>
        </div>
    </body>  
</html>

Выбрать все <p> элементы с классом «highlight», мы можем использовать contains():

from lxml import html

tree = html.fromstring(html_string)
highlighted_paragraphs = tree.xpath(‘//p[contains(@class,"highlight")]‘)

for paragraph in highlighted_paragraphs:
    print(paragraph.text)

# Output: 
# Paragraph 1
# Paragraph 3

Если бы мы хотели выбрать только <p> элементы, где находится класс точно, «выделение», мы бы использовали:

exact_match_paragraphs = tree.xpath(‘//p[@class="highlight"]‘)

Чтобы выбрать <div> элемент, а затем найти <p> элементы с классом «highlight» внутри, мы можем использовать относительный XPath:

div = tree.xpath(‘//div[@class="container"]‘)[0]
highlighted_paragraphs = div.xpath(‘./p[contains(@class,"highlight")]‘)

Собираем все вместе

В этом руководстве мы подробно рассмотрели, как выбирать элементы по классу с помощью XPath. Мы рассмотрели два основных подхода — использование функции contains() и точное сопоставление имен классов, а также основные соображения, лучшие практики и примеры.

Подведем итоги:

  • XPath — мощный язык запросов для выбора элементов в документах HTML/XML.
  • Классы — это способ присвоения категорий элементам, часто для целей стилизации или выбора.
  • Ассоциация contains(@class,‘classname‘) подход выбирает элементы, которые содержат указанный класс как часть значения атрибута класса
  • Ассоциация [@class=‘classname‘] подход выбирает элементы, у которых атрибут класса точно соответствует указанному классу
  • Селекторы классов XPath чувствительны к регистру и могут комбинироваться с другими критериями или относительными селекторами.
  • Важно выбрать самое простое выражение, которое достигнет вашей цели, и учитывать изменения в HTML-коде сайта с течением времени.

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

Применяя эти методы на практике, не забывайте всегда проявлять уважение к владельцам веб-сайтов и соблюдать все применимые условия обслуживания или файлы robots.txt. Приятного скрежетания!

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *