【Python】Python3網絡爬蟲實戰-30、PyQuery

在上一節我們介紹了 BeautifulSoup 的使用,它是一個非常強大的網頁解析庫,可有沒有覺得它的一些方法使用有點不適應?有沒有覺得它的 CSS 選擇器功能沒有那麼強大?

如果你對 Web 有所涉及,如果你比較喜歡用 CSS 選擇器,如果你對 jQuery 有所瞭解,那麼這裏有一個更適合你的解析庫—— PyQuery。

接下來我們就來感受一下 PyQuery 的強大之處。

1. 準備工作

在開始之前請確保已經正確安裝好了 PyQuery,如沒有安裝可以參考第一章的安裝過程。

2. 初始化

像 BeautifulSoup 一樣,PyQuery 初始化的時候也需要傳入 HTML 數據源來初始化一個操作對象,它的初始化方式有多種,比如直接傳入字符串,傳入 URL,傳文件名。下面我們來詳細介紹一下。

字符串初始化

首先我們用一個實例來感受一下:

html = '''
<div>
    <ul>
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('li'))
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這裏是Python學習者的聚集地,零基礎,進階,都歡迎

運行結果:

<li class="item-0">first item</li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>

在這裏我們首先引入了 PyQuery 這個對象,取別名爲 pq,然後聲明瞭一個長 HTML 字符串,當作參數傳遞給 PyQuery,這樣就成功完成了初始化,然後接下來將初始化的對象傳入 CSS 選擇器,在這個實例中我們傳入 li 節點,這樣就可以選擇所有的 li 節點,打印輸出可以看到所有的 li 節點的 HTML 文本。

URL初始化

初始化的參數不僅可以以字符串的形式傳遞,還可以傳入網頁的 URL,在這裏只需要指定參數爲 url 即可:

from pyquery import PyQuery as pq
doc = pq(url='http://www.segmentfault.com')
print(doc('title'))

運行結果:

<title>SegmentFault 思否</title>

這樣的話 PyQuery 會首先請求這個 URL,然後用得到的 HTML 內容完成初始化,其實就相當於我們用網頁的源代碼以字符串的形式傳遞給 PyQuery 來初始化。

它與下面的功能是相同的:

from pyquery import PyQuery as pq
import requests
doc = pq(requests.get('http://www.segmentfault.com').text)
print(doc('title'))

文件初始化

當然除了傳遞一個 URL,還可以傳遞本地的文件名,參數指定爲 filename 即可:

from pyquery import PyQuery as pq
doc = pq(filename='demo.html')
print(doc('li'))

當然在這裏需要有一個本地 HTML 文件 demo.html,內容是待解析的 HTML 字符串。這樣它會首先讀取本地的文件內容,然後用文件內容以字符串的形式傳遞給 PyQuery 來初始化。

以上三種初始化方式均可,當然最常用的初始化方式還是以字符串形式傳遞。

3. 基本CSS選擇器

我們首先用一個實例來感受一下 PyQuery 的 CSS 選擇器的用法:

html = '''
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('#container .list li'))
print(type(doc('#container .list li')))

運行結果:

<li class="item-0">first item</li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
<class 'pyquery.pyquery.PyQuery'>

在這裏我們初始化 PyQuery 對象之後,傳入了一個 CSS 選擇器,#container .list li,意思是選取 id 爲 container 的節點內部的 class 爲 list 的節點內部的所有 li 節點。然後打印輸出,可以看到成功獲取到了符合條件的節點。

然後我們將它的類型打印輸出,可以看到它的類型依然是 PyQuery類型。

4. 查找節點

下面我們介紹一些常用的查詢函數,這些函數和 jQuery 中的函數用法也完全相同。

子節點

查找子節點需要用到 find() 方法,傳入的參數是 CSS 選擇器,我們還是以上面的 HTML 爲例:

from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
print(type(items))
print(items)
lis = items.find('li')
print(type(lis))
print(lis)

運行結果:

<class 'pyquery.pyquery.PyQuery'>
<ul class="list">
    <li class="item-0">first item</li>
    <li class="item-1"><a href="link2.html">second item</a></li>
    <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
    <li class="item-1 active"><a href="link4.html">fourth item</a></li>
    <li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
<class 'pyquery.pyquery.PyQuery'>
<li class="item-0">first item</li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>

首先我們選取了 class 爲 list 的節點,然後我們調用了 find() 方法,傳入了 CSS 選擇器,選取其內部的 li 節點,最後都打印輸出即可觀察到對應的查詢結果,可以發現 find() 方法會將符合條件的所有節點選擇出來,結果的類型是 PyQuery 類型。

其實 find() 的查找範圍是節點的所有子孫節點,而如果我們只想查找子節點,那可以用 children() 方法:

lis = items.children()
print(type(lis))
print(lis)

運行結果:

<class 'pyquery.pyquery.PyQuery'>
<li class="item-0">first item</li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>

如果要篩選所有子節點中符合條件的節點,比如我們想篩選出子節點中 class 爲 active 的節點,可以向 children() 方法傳入 CSS 選擇器 .active:

lis = items.children('.active')
print(lis)

運行結果:

<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>

可以看到輸出的結果已經做了篩選,留下了 class 爲 active 的節點。

父節點

我們可以用 parent() 方法來獲取某個節點的父節點,我們用一個實例來感受一下:

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
container = items.parent()
print(type(container))
print(container)

運行結果:

<class 'pyquery.pyquery.PyQuery'>
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>

在這裏我們首先用 .list 選取了 class 爲 list 的節點,然後調用了 parent() 方法,得到其父節點,類型依然是 PyQuery 類型。

這裏的父節點是該節點的直接父節點,也就是說,它不會再去查找父節點的父節點,即祖先節點。

但是如果我們想獲取某個祖先節點怎麼辦呢?可以用 parents() 方法:

from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
parents = items.parents()
print(type(parents))
print(parents)

運行結果:

<class 'pyquery.pyquery.PyQuery'>
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
 <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>

在這裏我們調用了 parents() 方法,可以看到輸出結果有兩個,一個是 class 爲 wrap 的節點,一個是 id 爲 container 的節點,也就是說,parents() 方法會返回所有的祖先節點。

如果我們想要篩選某個祖先節點的話可以向 parents() 方法傳入 CSS 選擇器,這樣就會返回祖先節點中符合 CSS 選擇器的節點:

parent = items.parents('.wrap')
print(parent)

運行結果:

<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這裏是Python學習者的聚集地,零基礎,進階,都歡迎

可以看到輸出結果就少了一個節點,只保留了 class 爲 wrap 的節點。

兄弟節點

在上面我們說明了子節點和父節點的用法,還有一種節點那就是兄弟節點,如果要獲取兄弟節點可以使用 siblings() 方法。我們還是以上面的 HTML 代碼爲例來感受一下:

from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.list .item-0.active')
print(li.siblings())

在這裏我們首先選擇了 class 爲 list 的節點內部的 class 爲 item-0 和 active 的節點,也就是第三個 li 節點。那麼很明顯它的兄弟節點有四個,那就是第一、二、四、五個 li 節點。

運行結果:

<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-0">first item</li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>

可以看到運行結果也正是我們剛纔所說的四個兄弟節點。

如果要篩選某個兄弟節點,我們依然可以向方法傳入 CSS 選擇器,這樣就會從所有兄弟節點中挑選出符合條件的節點了:

from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.list .item-0.active')
print(li.siblings('.active'))

在這裏我們篩選了 class 爲 active 的節點,通過剛纔的結果我們可以觀察到 class 爲 active 的兄弟節點只有第四個 li 節點,所以結果應該是一個。

運行結果:

<li class="item-1 active"><a href="link4.html">fourth item</a></li>

5. 遍歷

我們剛纔可以觀察到,PyQuery 的選擇結果可能是多個節點,可能是單個節點,類型都是 PyQuery 類型,並沒有返回像 BeautifulSoup 一樣的列表。

對於單個節點來說,我們可以直接打印輸出,也可直接轉成字符串:

from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
print(str(li))

運行結果:

<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

對於多個節點的結果,我們就需要遍歷來獲取了,例如這裏我們把每一個 li 節點進行遍歷,,需要調用 items() 方法:

from pyquery import PyQuery as pq
doc = pq(html)
lis = doc('li').items()
print(type(lis))
for li in lis:
    print(li, type(li))

運行結果:

<class 'generator'>
<li class="item-0">first item</li>
<class 'pyquery.pyquery.PyQuery'>
<li class="item-1"><a href="link2.html">second item</a></li>
<class 'pyquery.pyquery.PyQuery'>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<class 'pyquery.pyquery.PyQuery'>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<class 'pyquery.pyquery.PyQuery'>
<li class="item-0"><a href="link5.html">fifth item</a></li>
<class 'pyquery.pyquery.PyQuery'>

在這裏我們可以發現調用 items() 方法後,會得到一個生成器,遍歷一下,就可以逐個得到 li 節點對象了,它的類型也是 PyQuery 類型,所以每個 li 節點還可以調用前面所說的方法進行選擇,比如繼續查詢子節點,尋找某個祖先節點等等,非常靈活。

6. 獲取信息

提取到節點之後,我們的最終目的當然是提取節點所包含的信息了,比較重要的信息有兩類,一是獲取屬性,二是獲取文本,下面我們分別進行說明。

獲取屬性

提取到某個 PyQuery 類型的節點之後,我們可以調用 attr() 方法來獲取屬性:

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a, type(a))
print(a.attr('href'))

運行結果:

<a href="link3.html"><span class="bold">third item</span></a> <class 'pyquery.pyquery.PyQuery'>
link3.html

在這裏我們首先選中了 class 爲 item-0 和 active 的 li 節點內的 a 節點,它的類型可以看到是 PyQuery 類型。

然後我們調用了 attr() 方法,然後傳入屬性的名稱,就可以得到這個屬性值了。

也可以通過調用 attr 屬性來獲取屬性,用法如下:

print(a.attr.href)

結果:

link3.html

結果是完全一樣的,在這裏我們沒有調用方法,而是調用了 attr 屬性,然後再調用屬性名,同樣可以得到屬性值。

如果我們選中的是多個元素,然後調用 attr() 方法會出現怎樣的結果?我們用一個實例來測試一下:

a = doc('a')
print(a, type(a))
print(a.attr('href'))
print(a.attr.href)

運行結果:

<a href="link2.html">second item</a><a href="link3.html"><span class="bold">third item</span></a><a href="link4.html">fourth item</a><a href="link5.html">fifth item</a> <class 'pyquery.pyquery.PyQuery'>
link2.html
link2.html

照理來說我們選中的 a 節點應該有四個,而且打印結果也是四個,但是當我們調用 attr() 方法時,返回的結果卻只是第一個。

所以當返回結果包含多個節點時,調用 attr() 方法只會得到第一個節點的屬性。

那麼遇到這種情況如果我們想獲取所有的 a 節點的屬性,就需要用到上文所說的遍歷了:

from pyquery import PyQuery as pq
doc = pq(html)
a = doc('a')
for item in a.items():
    print(item.attr('href'))

運行結果:

link2.html
link3.html
link4.html
link5.html

所以,在進行屬性獲取的時候觀察一下返回節點是一個還是多個,如果是多個,則需要遍歷才能依次獲取每個節點的屬性。

獲取文本

獲取節點之後的另一個主要的操作就是獲取其內部的文本了,我們可以調用 text() 方法來獲取:

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.text())

運行結果:

<a href="link3.html"><span class="bold">third item</span></a>
third item

我們首先選中了一個 a 節點,然後調用了 text() 方法,就可以獲取其內部的文本信息了,它會忽略掉節點內部包含的所有 HTML,只返回純文字內容。

但如果我們想要獲取這個節點內部的 HTML 文本,就可以用 html() 方法:

from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
print(li.html())

這裏我們選中了第三個 li 節點,然後調用了 html() 方法,它返回的結果應該是li節點內的所有 HTML 文本。

運行結果:

<a href="link3.html"><span class="bold">third item</span></a>

這裏同樣有一個問題,如果我們選中的結果是多個節點,text() 或 html() 會返回什麼內容?

我們用一個實例來看一下:

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('li')
print(li.html())
print(li.text())
print(type(li.text())

運行結果:

<a href="link2.html">second item</a>
second item third item fourth item fifth item
<class 'str'>

結果可能比較出乎意料,我們選中的是所有的 li 節點,可以發現 html() 方法返回的是第一個 li 節點的內部 HTML 文本,而 text() 則返回了所有的 li 節點內部純文本,中間用一個空格分割開,實際上是一個字符串。

所以這個地方值得注意,如果我們得到的結果是多個節點,如果要獲取每個節點的內部 HTML 文本,則需要遍歷每個節點,而 text() 方法不需要遍歷就可以獲取,它是將所有節點取文本之後合併成一個字符串。

7. 節點操作

PyQuery 提供了一系列方法來對節點進行動態修改操作,比如爲某個節點添加一個 class,移除某個節點等等,這些操作有時候會爲提取信息帶來極大的便利。

由於節點操作的方法太多,下面舉幾個典型的例子來說明它的用法。

addClass、removeClass

我們先用一個實例來感受一下:

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.removeClass('active')
print(li)
li.addClass('active')
print(li)

首先我們選中了第三個 li 節點,然後調用了 removeClass() 方法,將 li 節點的 active 這個 class 移除,後來又調用了 addClass() 方法,又將 class 添加回來,每執行一次操作,就打印輸出一下當前 li 節點的內容。

運行結果:

<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-0"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

可以看到一共進行了三次輸出,第二次輸出 li 節點的 active 這個 class 被移除了,第三次 class 又添加回來了。

所以說我們 addClass()、removeClass() 這些方法可以動態地改變節點的 class 屬性。

attr、text、html

當然除了操作 class 這個屬性,也有 attr() 方法來專門針對屬性進行操作,也可以用 text()、html() 方法來改變節點內部的內容。

我們用實例感受一下:

html = '''
<ul class="list">
     <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
</ul>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.attr('name', 'link')
print(li)
li.text('changed item')
print(li)
li.html('<span>changed item</span>')
print(li)

在這裏我們首先選中了 li 節點,然後調用 attr() 方法來修改屬性,第一個參數爲屬性名,第二個參數爲屬性值,然後我們調用了 text() 和 html() 方法來改變節點內部的內容。三次操作後分別又打印輸出當前 li 節點。

運行結果:

<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-0 active" name="link"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-0 active" name="link">changed item</li>
<li class="item-0 active" name="link"><span>changed item</span></li>

可以發現,調用 attr() 方法後,li 節點多了一個原本不存在的屬性 name,其值爲 link,調用 text() 方法,傳入文本之後,發現 li 節點內部的文本就全被改變爲傳入的字符串文本了。調用 html() 方法傳入 HTML 文本之後,li 節點內部又改變爲傳入的 HTML 文本。

所以說,attr() 方法如果只傳入第一個參數屬性名,則是獲取這個屬性值,如果傳入第二個參數,可以用來修改屬性值,text() 和 html() 方法如果不傳參數是獲取節點內純文本和 HTML 文本,如果傳入參數則是進行賦值。

remove

remove 顧名思義移除,remove() 方法有時會爲信息的提取帶來非常大的便利。下面我們看一個實例:

html = '''
<div class="wrap">
    Hello, World
    <p>This is a paragraph.</p>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
wrap = doc('.wrap')
print(wrap.text())

在這裏有一段 HTML 文本,我們現在想提取 Hello, World 這個字符串,而不要 p 節點內部的字符串,這個怎樣來提取?

在這裏我們直接先嚐試提取 class 爲 wrap 的節點的內容,看看是不是我們想要的,運行結果如下:

Hello, World This is a paragraph.

然而這個結果還包含了內部的 p 節點的內容,也就是說 text() 把所有的純文本全提取出來了。如果我們想去掉 p 節點內部的文本,可以選擇再把 p 節點內的文本提取一遍,然後從整個結果中移除這個子串,但這個做法明顯比較繁瑣。

那這是 remove() 方法就可以派上用場了,我們可以接着這麼做:

wrap.find('p').remove()
print(wrap.text())

我們首先選中了 p 節點,然後調用了 remove() 方法將其移除,然後這時 wrap 內部就只剩下 Hello, World 這句話了,然後再利用 text()方 法提取即可。

所以說,remove() 方法可以刪除某些冗餘內容,來方便我們的提取。在適當的時候使用可以極大地提高效率。

另外其實還有很多節點操作的方法,比如 append()、empty()、prepend() 等方法,他們和 jQuery 的用法是完全一致的,詳細的用法可以參考官方文檔:http://pyquery.readthedocs.io...

8. 僞類選擇器

CSS 選擇器之所以強大,還有一個很重要的原因就是它支持多種多樣的僞類選擇器。例如選擇第一個節點、最後一個節點、奇偶數節點、包含某一文本的節點等等,我們用一個實例感受一下:

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('li:first-child')
print(li)
li = doc('li:last-child')
print(li)
li = doc('li:nth-child(2)')
print(li)
li = doc('li:gt(2)')
print(li)
li = doc('li:nth-child(2n)')
print(li)
li = doc('li:contains(second)')
print(li)
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這裏是Python學習者的聚集地,零基礎,進階,都歡迎

在這裏我們使用了 CSS3 的僞類選擇器,依次選擇了第一個 li 節點、最後一個 li 節點、第二個 li 節點、第三個 li 之後的 li 節點、偶數位置的 li 節點、包含 second 文本的 li 節點,功能十分強大。

9. 結語

到此爲止 PyQuery 的常用用法就介紹完了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章