Статьи

PyQuery: Python’s jQuery

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

Чтобы начать работу с PyQuery , установите пакет Python с помощью PIP.

1
pip install pyquery

После установки PyQuery импортируйте его в программу Python.

1
from pyquery import PyQuery as pq

Давайте начнем с базового примера того, как это работает. Рассмотрим следующий HTML:

1
2
3
4
5
<div id=»divMain»>
  <span>
    Hello World
  
</div>

Передайте входной XML объекту PyQuery и вы сможете применить к нему запросы в стиле jQuery.

1
divMain = pq(«<div id=’divMain’><span>Hello World

Предположим, что divMain является объектом jQuery и распечатывает HTML-содержимое div.

1
print divMain(‘#divMain’).html()

Сохраните изменения и попробуйте запустить программу. Вы должны иметь следующий вывод:

1
<span>Hello World

Чтобы получить доступ к тексту Hello World изнутри диапазона, код должен быть:

1
print divMain(‘#divMain’).text()

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

1
Hello World

Теперь давайте посмотрим, как читать атрибуты с PyQuery библиотеки PyQuery . Предположим, что у вас есть элемент HTML, как показано:

1
2
3
4
<ul id=»ulMain»>
    <li>Roy</li>
    <li>Hari</li>
</ul>

Используйте библиотеку PyQuery для чтения вышеуказанного содержимого HTML.

1
ulMain = pq(«<ul id=’ulMain’><li>Roy</li><li>Hari</li></ul>»)

Попробуем получить доступ к атрибуту идентификатора ulMain ul.

1
print ulMain.attr(‘id’)

Сохраните вышеуказанные изменения и попробуйте запустить программу Python. На терминале должен быть напечатан идентификатор ulMain .

Вы видели, как получить доступ к атрибуту идентификатора ul ulMain . Давайте попробуем установить имя класса для того же элемента ulMain . Чтобы указать атрибут имени класса, вам нужно указать имя атрибута и его соответствующее значение, как показано:

1
ulMain.attr(‘class’,’testclass’)

Напечатайте объект ulMain и у вас должен быть элемент с атрибутом class.

1
2
3
4
<ul id=»ulMain» class=»testclass»>
    <li>Roy</li>
    <li>Hari</li>
</ul>

Вы также можете добавлять и удалять классы напрямую, без использования метода attr . Чтобы добавить класс к элементу, вы можете использовать метод addClass .

1
ulMain.addClass(‘test’)

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

1
ulMain.removeClass(‘test’)

Помимо атрибутов, элемент будет иметь некоторые свойства CSS. Чтобы добавить или изменить свойства CSS, вы можете использовать метод css и указать свойства. Допустим, вы хотите указать высоту в стиле ul ulMain . Следующий код добавит требуемые свойства стиля к элементу.

1
ulMain.css(‘height’,’100px’)

Сохраните вышеуказанные изменения и попробуйте выполнить программу Python. Вы должны напечатать ul ulMain вместе с новым стилем.

1
2
3
4
<ul id=»ulMain» style=»height: 100px»>
    <li>Roy</li>
    <li>Hari</li>
</ul>

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

1
ulMain.css({‘height’:’100px’,’width’:’100px’})

Запустите программу, и вы должны добавить стили в ulMain .

1
2
3
4
<ul id=»ulMain» style=»width: 100px; height: 100px»>
    <li>Roy</li>
    <li>Hari</li>
</ul>

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

Предположим, у вас есть основной контейнер div, называемый divMain .

1
divMain = pq(«<div id=’divMain’></div>»)

Давайте создадим новый элемент span, используя PyQuery .

1
span = pq(‘<span>Hello World

Добавьте некоторые свойства CSS в span.

1
span.css({‘color’:’blue’,’font-weight’:’bold’})

PyQuery предоставляет метод для добавления элементов к существующим элементам. Вы можете использовать метод append для добавления элемента span в div divMain . Вот код:

1
2
divMain.append(span)
print divMain

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

1
2
3
4
5
<div id=»divMain»>
  <span style=»color: blue; font-weight: bold»>
    Hello World
  
</div>

Вы использовали метод append для добавления span к div. У вас есть другой альтернативный метод с именем appendTo который добавит узлы к значению. В приведенном выше случае вы можете использовать метод так:

1
span.appendTo(divMain)

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

Предположим, что у вас есть определенный фрагмент HTML, как показано:

01
02
03
04
05
06
07
08
09
10
11
<div id=»divMain»>
    <div id=»content»>
        <ul>
            <li>Jade</li>
            <li>Jim</li>
        </ul>
    </div>
    <div id=»list»>
        <span>Hello World
    </div>
</div>

Добавьте следующий HTML- PyQuery объекту PyQuery :

01
02
03
04
05
06
07
08
09
10
11
divMain = pq(«<div id=’divMain’>»+
«<div id=’content’>»+
«<ul>»+
«<li>Jade</li>»+
«<li>Jim</li>»+
«</ul>»
«</div>»+
«<div id=’list’>»+
«<span>Hello World
«</div>»+
«</div>»)

Давайте использовать PyQuery чтобы найти дочерних элементов div divMain . Добавьте следующую строку кода, чтобы напечатать дочерние divMain .

1
print divMain.children()

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

1
2
3
4
5
6
7
<div id=»content»>
    <ul>
        <li>Jade</li>
        <li>Jim</li>
    </ul>
</div>
<div id=»list»><span>Hello World

Чтобы найти ближайший элемент к элементу, вы можете использовать метод closest . Чтобы найти ближайший элемент div к span, код должен быть:

1
print divMain(‘span’).closest(‘div’)

Приведенная выше команда вернет следующий вывод:

1
<div id=»list»><span>Hello World

Метод find также доступен для поиска элементов. Например, чтобы найти диапазон внутри divMain , вам нужно вызвать метод, как показано ниже:

1
print divMain.find(‘span’)

Приведенная выше команда вернула бы span.

1
<span>Hello World

В то время как append выполняет добавление элементов к существующим элементам, иногда вам нужно вставить элементы после или перед определенными элементами. PyQuery предоставляет метод для вставки элементов до или после других элементов.

Давайте определим новый элемент абзаца, который будет вставлен после span внутри divMain div.

1
p = pq(‘<p>Welcome</p>’)

Вызовите метод insertAfter для элемента абзаца p чтобы вставить его после span.

1
2
p.insertAfter(divMain(‘span’))
print divMain

Сохраните вышеуказанные изменения и запустите программу Python. Вы должны иметь следующий вывод:

01
02
03
04
05
06
07
08
09
10
11
12
<div id=»divMain»>
    <div id=»content»>
        <ul>
            <li>Jade</li>
            <li>Jim</li>
        </ul>
    </div>
    <div id=»list»>
        <span>Hello World
        <p>Welcome</p>
    </div>
</div>

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

1
2
p.insertBefore(divMain(‘span’))
print divMain

Сохраните изменения и запустите программу. Вы должны увидеть следующий вывод на терминале:

01
02
03
04
05
06
07
08
09
10
11
12
<div id=»divMain»>
    <div id=»content»>
        <ul>
            <li>Jade</li>
            <li>Jim</li>
        </ul>
    </div>
    <div id=»list»>
        <p>Welcome</p>
        <span>Hello World
    </div>
</div>

В этом руководстве вы PyQuery , как начать работу с PyQuery , библиотекой Python, которая позволяет выполнять запросы jQuery к документам XML. Вы видели, как управлять атрибутами и стилями CSS элементов HTML.

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

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