欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python解析庫pyquery 的使用詳解

 更新時間:2025年04月12日 09:45:19   作者:攻城獅7號  
要是你接觸過Web開發(fā),平時習(xí)慣用CSS選擇器,或者對jQuery有一定了解,那我得給你介紹一個更稱手的解析庫,它就是pyquery,本文給大家介紹Python解析庫pyquery 的使用詳解,感興趣的朋友一起看看吧

前言

上兩節(jié)我們講了Beautiful Soup這個網(wǎng)頁解析庫,它確實(shí)很厲害。不過,大家用它的一些方法時,會不會感覺不太順手?還有它的CSS選擇器,用起來是不是覺得功能沒那么強(qiáng)呢?

要是你接觸過Web開發(fā),平時習(xí)慣用CSS選擇器,或者對jQuery有一定了解,那我得給你介紹一個更稱手的解析庫,它就是pyquery。 下面,咱們就一起來見識下pyquery有多厲害。

一、pyquery 初始化

在正式開始前,得先確認(rèn)你已經(jīng)把pyquery正確安裝好了。要是還沒安裝,就得自己動手通過pip或pip3安裝一下。 和Beautiful Soup類似,初始化pyquery時,同樣要傳入HTML文本,以此來創(chuàng)建一個PyQuery對象。它有好幾種初始化的辦法,既可以直接傳入字符串,也能傳入U(xiǎn)RL,還能傳入文件名等等。接下來,我們就詳細(xì)講講這些方法。

1.1 字符串初始化

咱們先通過一個實(shí)際例子來體驗(yàn)體驗(yàn):

html = '''
<div>
    <ul>
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >second item</a></li>
         <li class="item-0 active"><a href="link3.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >fourth item</a></li>
         <li class="item-0"><a href="link5.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >fifth item</a></li>
     </ul>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
for item in doc('li').items():
    print(item.outer_html())

運(yùn)行結(jié)果如下:

咱們先引入PyQuery對象,給它取個pq的別名。接著弄了個很長的HTML字符串,把這個字符串作為參數(shù),傳給PyQuery類,這樣就完成了初始化。初始化完之后,再把得到的對象放到CSS選擇器里。在這個例子里,我們輸入li節(jié)點(diǎn),這么一來,就能選中所有的li節(jié)點(diǎn)了 。

1.2 URL 初始化

初始化時,參數(shù)不只能用字符串形式來傳遞。要是你想傳入網(wǎng)頁的URL,也完全沒問題,只要把參數(shù)指定為url就行 :

from pyquery import PyQuery as pq
doc = pq(url='https://linshantang.blog.csdn.net/')
print(doc('title'))

運(yùn)行結(jié)果:

<title>攻城獅7號-CSDN博客</title>

這么操作后,PyQuery對象會先對這個URL發(fā)起請求。等拿到網(wǎng)頁的HTML內(nèi)容,就用這些內(nèi)容完成初始化。這和直接把網(wǎng)頁的源代碼,以字符串形式傳給PyQuery類來初始化,效果是一樣的 。

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

from pyquery import PyQuery as pq
import requests
doc = pq(requests.get('https://linshantang.blog.csdn.net/').text)
print(doc('title'))

1.3 文件初始化

當(dāng)然啦,初始化的時候,除了能傳一個URL,要是你想傳本地的文件名也是可以的,只要把參數(shù)指定成filename就行:

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

當(dāng)然,得先有個本地的HTML文件,叫demo.html,里面的內(nèi)容就是要解析的HTML字符串。這樣一來,它會先讀取這個本地文件里的內(nèi)容,接著把文件內(nèi)容當(dāng)成字符串,傳給PyQuery類進(jìn)行初始化。

上面這3種初始化方法都能用,不過在實(shí)際使用中,最常用的初始化方式還是用字符串來傳遞 。

二、基本 CSS 選擇器

咱們先通過一個實(shí)際例子,來體驗(yàn)體驗(yàn)pyquery里CSS選擇器該怎么用:

html = '''
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >second item</a></li>
         <li class="item-0 active"><a href="link3.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >fourth item</a></li>
         <li class="item-0"><a href="link5.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >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')))

運(yùn)行結(jié)果:

這里呢,我們先初始化了PyQuery對象,接著輸入了一個CSS選擇器#container .list li 。這個選擇器的意思是,先找到id是container的節(jié)點(diǎn),再從這個節(jié)點(diǎn)里面,找到class是list的節(jié)點(diǎn),最后把這個list節(jié)點(diǎn)里面所有的li節(jié)點(diǎn)選出來。然后我們把選出來的結(jié)果打印出來,能看到,確實(shí)成功找到了符合條件的節(jié)點(diǎn)。 最后呢,我們把選出來結(jié)果的類型也打印出來??梢钥吹?,它還是PyQuery類型 。

三、pyquery 查找節(jié)點(diǎn)

接下來給大家講講一些常用的查詢方法,這些方法的使用方式跟jQuery里的方法一模一樣 。

3.1 子節(jié)點(diǎn)

要是想查找子節(jié)點(diǎn),就得用find方法,這個方法的參數(shù)是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)

運(yùn)行結(jié)果:

首先,我們選中class是list的節(jié)點(diǎn),接著調(diào)用find()方法,把CSS選擇器作為參數(shù)傳進(jìn)去,這樣就選中了這個節(jié)點(diǎn)里面的li節(jié)點(diǎn),最后把結(jié)果打印出來。可以看到,find()方法會把所有符合條件的節(jié)點(diǎn)都選出來,選出來的結(jié)果是PyQuery類型。 實(shí)際上,find方法會在節(jié)點(diǎn)的所有子孫節(jié)點(diǎn)里查找。要是我們只想找子節(jié)點(diǎn),那就可以用children方法。

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

運(yùn)行結(jié)果如下:

要是想從所有子節(jié)點(diǎn)里挑出符合條件的節(jié)點(diǎn),就拿篩選出子節(jié)點(diǎn)里class是active的節(jié)點(diǎn)來說,可以給children()方法傳入CSS選擇器.active。

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

運(yùn)行結(jié)果:

從輸出結(jié)果能明顯看出,已經(jīng)篩選過了,只剩下class是active的節(jié)點(diǎn) 。

3.2 父節(jié)點(diǎn)

我們可以用parent方法獲取某個節(jié)點(diǎn)的父節(jié)點(diǎn),下面通過一個例子來看看效果:

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" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >second item</a></li>
             <li class="item-0 active"><a href="link3.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >fourth item</a></li>
             <li class="item-0"><a href="link5.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >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)

運(yùn)行結(jié)果如下:

這里我們先用.list選中class是list的節(jié)點(diǎn),接著調(diào)用parent方法,就能得到這個節(jié)點(diǎn)的父節(jié)點(diǎn),這個父節(jié)點(diǎn)也是PyQuery類型。 這里得到的父節(jié)點(diǎn)是直接的父節(jié)點(diǎn),不會再去查父節(jié)點(diǎn)的父節(jié)點(diǎn),也就是不會找祖先節(jié)點(diǎn)。 要是想獲取某個祖先節(jié)點(diǎn),該咋整呢?這時候就可以用parents方法。

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

運(yùn)行結(jié)果:

能看到,輸出結(jié)果有倆:一個是class為wrap的節(jié)點(diǎn),另一個是id為container的節(jié)點(diǎn)。這說明,parents()方法會把所有的祖先節(jié)點(diǎn)都返回。 要是想篩選出某個祖先節(jié)點(diǎn),就可以給parents方法傳入CSS選擇器,這樣就能得到祖先節(jié)點(diǎn)里符合這個CSS選擇器的節(jié)點(diǎn)。

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

運(yùn)行結(jié)果:

從輸出結(jié)果能明顯看出來,少了一個節(jié)點(diǎn),現(xiàn)在只剩下class是wrap的那個節(jié)點(diǎn)了。

3.3 兄弟節(jié)點(diǎn)

上面我們講了子節(jié)點(diǎn)和父節(jié)點(diǎn)的用法,還有一種節(jié)點(diǎn)叫兄弟節(jié)點(diǎn)。要是想獲取兄弟節(jié)點(diǎn),可以用siblings()方法。咱們還是接著用上面的HTML代碼來說明:

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

這里先選中class是list的節(jié)點(diǎn)里面,class分別為item - 0和active的節(jié)點(diǎn),也就是第三個li節(jié)點(diǎn)。顯然,它有4個兄弟節(jié)點(diǎn),分別是第一個、第二個、第四個和第五個li節(jié)點(diǎn)。

運(yùn)行結(jié)果:

能看到,這就是我們剛才說的那4個兄弟節(jié)點(diǎn)。 要是想篩選出某個兄弟節(jié)點(diǎn),還是可以給siblings方法傳入CSS選擇器,這樣就能從所有兄弟節(jié)點(diǎn)里挑出符合條件的節(jié)點(diǎn)。

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

這里我們篩選了 class 為 active 的節(jié)點(diǎn),通過剛才的結(jié)果可以觀察到,class 為 active 的兄弟節(jié)點(diǎn)只有第四個 li 節(jié)點(diǎn),所以結(jié)果應(yīng)該是一個。我們再看一下運(yùn)行結(jié)果:

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

四、遍歷

剛才能看到,pyquery選擇出來的結(jié)果可能是多個節(jié)點(diǎn),也可能是單個節(jié)點(diǎn),但類型都是PyQuery類型,不會像Beautiful Soup那樣返回列表。 要是選出來的是單個節(jié)點(diǎn),既可以直接打印,也能直接轉(zhuǎn)成字符串。

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

運(yùn)行結(jié)果:

要是選擇結(jié)果有多個節(jié)點(diǎn),就得通過遍歷來獲取每個節(jié)點(diǎn)。就像這里,要遍歷每個li節(jié)點(diǎn)的話,就得調(diào)用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))

運(yùn)行結(jié)果如下:

能發(fā)現(xiàn),調(diào)用items()方法后會得到一個生成器,對這個生成器進(jìn)行遍歷,就能逐個拿到li節(jié)點(diǎn)對象,這些對象也是PyQuery類型。每個li節(jié)點(diǎn)都能調(diào)用前面提到的方法來做選擇操作,像接著查找子節(jié)點(diǎn)、找某個祖先節(jié)點(diǎn)之類的,用起來很靈活。

五、獲取信息

把節(jié)點(diǎn)提取出來以后,我們的最終目標(biāo)肯定是要提取出節(jié)點(diǎn)里包含的信息。其中比較關(guān)鍵的信息有兩種,一種是獲取節(jié)點(diǎn)的屬性,另一種是獲取節(jié)點(diǎn)的文本內(nèi)容。下面我就分別給大家講一講。

5.1 獲取屬性

當(dāng)提取到一個PyQuery類型的節(jié)點(diǎn)后,就能調(diào)用attr()方法來獲取這個節(jié)點(diǎn)的屬性了。

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" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >second item</a></li>
             <li class="item-0 active"><a href="link3.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >fourth item</a></li>
             <li class="item-0"><a href="link5.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >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'))

運(yùn)行結(jié)果如下:

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

這里先選中class是item - 0和active的li節(jié)點(diǎn)里面的a節(jié)點(diǎn),這個節(jié)點(diǎn)是PyQuery類型。 接著調(diào)用attr方法,在方法里傳入屬性名,就能得到對應(yīng)的屬性值。 另外,也能通過調(diào)用attr屬性來獲取屬性,具體用法如下:

print(a.attr.href)

這兩種方法得到的結(jié)果是完全相同的。 要是選中了多個元素,再去調(diào)用attr方法,會得到什么樣的結(jié)果呢?下面我們通過實(shí)際例子來測試看看。

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

運(yùn)行結(jié)果如下:

按道理,我們選中的a節(jié)點(diǎn)應(yīng)該有4個,打印結(jié)果也該是4個。但調(diào)用attr方法時,返回的卻只有第一個節(jié)點(diǎn)的屬性。這是因?yàn)?,?dāng)返回結(jié)果包含多個節(jié)點(diǎn)時,調(diào)用attr方法只能得到第一個節(jié)點(diǎn)的屬性。 要是遇到這種情況,想獲取所有a節(jié)點(diǎn)的屬性,就得用前面說過的遍歷方法了。

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

運(yùn)行結(jié)果:

所以,在獲取屬性的時候,要先看返回的節(jié)點(diǎn)是一個還是多個。要是返回多個節(jié)點(diǎn),就得通過遍歷才能逐個獲取每個節(jié)點(diǎn)的屬性。

5.2 獲取文本

提取到節(jié)點(diǎn)后,另一個重要操作就是獲取其內(nèi)部的文本內(nèi)容,這時調(diào)用text方法就能達(dá)成這一目的。

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" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >second item</a></li>
             <li class="item-0 active"><a href="link3.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >fourth item</a></li>
             <li class="item-0"><a href="link5.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >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())

運(yùn)行結(jié)果:

這里先選中一個a節(jié)點(diǎn),接著調(diào)用text方法,就能獲取該節(jié)點(diǎn)內(nèi)部的文本信息。這時它會把節(jié)點(diǎn)內(nèi)部的所有HTML內(nèi)容忽略掉,只返回純文本。 不過要是想獲取這個節(jié)點(diǎn)內(nèi)部的HTML文本,那就得使用html方法了。

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

這里我們選定了第三個li節(jié)點(diǎn),隨后調(diào)用了html()方法。該方法返回的結(jié)果會是這個li節(jié)點(diǎn)內(nèi)包含的所有HTML文本內(nèi)容。

運(yùn)行結(jié)果:

這里存在一個疑問,如果我們選中的結(jié)果包含多個節(jié)點(diǎn),那么調(diào)用 text() 或 html() 方法會返回什么樣的內(nèi)容呢?下面我們通過實(shí)際例子來探究一下。

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-1"><a href="link2.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >second item</a></li>
             <li class="item-0 active"><a href="link3.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >fourth item</a></li>
             <li class="item-0"><a href="link5.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >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()))

運(yùn)行結(jié)果如下:

結(jié)果可能有點(diǎn)讓人意外,html方法返回的是第一個li節(jié)點(diǎn)內(nèi)部的HTML文本,而text方法返回的是所有l(wèi)i節(jié)點(diǎn)內(nèi)部的純文本,各文本間用一個空格分隔,也就是返回一個字符串。 所以這里要特別留意,如果得到的結(jié)果是多個節(jié)點(diǎn),還想獲取每個節(jié)點(diǎn)內(nèi)部的HTML文本,那就需要對每個節(jié)點(diǎn)進(jìn)行遍歷。而text()方法不用遍歷就能獲取文本,它會把所有節(jié)點(diǎn)的文本提取出來并合并成一個字符串。

六、節(jié)點(diǎn)操作

pyquery提供了一系列可對節(jié)點(diǎn)進(jìn)行動態(tài)修改的方法,像給某個節(jié)點(diǎn)添加一個class,或者移除某個節(jié)點(diǎn)等。這些操作有時能為信息提取帶來極大便利。 鑒于節(jié)點(diǎn)操作的方法眾多,下面我會列舉幾個典型例子來說明其用法。

6.1 addClass 和 removeClass

那咱們先通過一個具體的實(shí)例來體驗(yàn)一番:

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" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >second item</a></li>
             <li class="item-0 active"><a href="link3.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >fourth item</a></li>
             <li class="item-0"><a href="link5.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >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節(jié)點(diǎn),接著調(diào)用removeClass()方法,把li節(jié)點(diǎn)上的active這個class給去掉了,之后又調(diào)用了addClass()方法,再把這個class添加回來。每次執(zhí)行完一次操作,就把當(dāng)前l(fā)i節(jié)點(diǎn)的內(nèi)容打印輸出。 運(yùn)行后得到的結(jié)果如下:

從結(jié)果能看到,總共輸出了3次。在第二次輸出的時候,li節(jié)點(diǎn)的active這個class已經(jīng)被移除掉了,而到第三次輸出時,這個class又被重新添加回來了。 由此可見,addClass和removeClass這兩個方法是能夠?qū)?jié)點(diǎn)的class屬性進(jìn)行動態(tài)修改的。

6.2 attr、text、html

當(dāng)然,除了對 class 屬性進(jìn)行操作外,還能使用 attr 方法操作其他屬性。另外,也可借助 text 和 html 方法來改變節(jié)點(diǎn)內(nèi)部的內(nèi)容。下面是相關(guān)示例:

html = '''
<ul class="list">
     <li class="item-0 active"><a href="link3.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ><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節(jié)點(diǎn),之后調(diào)用attr方法修改屬性。attr方法的第一個參數(shù)是屬性名,第二個參數(shù)是屬性值。接著,我們又調(diào)用text和html方法來改變節(jié)點(diǎn)內(nèi)部的內(nèi)容。每次操作完成后,都會打印輸出當(dāng)前的li節(jié)點(diǎn)。 下面是運(yùn)行結(jié)果:

可以看出,調(diào)用attr方法后,li節(jié)點(diǎn)新增了一個原本不存在的屬性“name”,其值為“link”。隨后調(diào)用text方法并傳入文本,li節(jié)點(diǎn)內(nèi)部的文本就都變成了傳入的字符串文本。最后,調(diào)用html方法并傳入HTML文本,li節(jié)點(diǎn)內(nèi)部又變成了傳入的HTML文本。 由此可知,attr方法若只傳入第一個參數(shù)即屬性名,是用于獲取該屬性值;若傳入第二個參數(shù),則可用來修改屬性值。text和html方法若不傳入?yún)?shù),分別是獲取節(jié)點(diǎn)內(nèi)的純文本和HTML文本;若傳入?yún)?shù),則是進(jìn)行賦值操作。

6.3 remove

從名字就能知道,remove 方法的作用是移除節(jié)點(diǎn),在某些情況下,它能極大地便利信息提取。下面給出一段 HTML 文本,咱們接著分析它的應(yīng)用。

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())

現(xiàn)在你想提取“Hello, World”這個字符串,同時排除 p 節(jié)點(diǎn)內(nèi)部的字符串,該怎么做呢? 這里直接先試著提取 class 為 wrap 的節(jié)點(diǎn)的內(nèi)容,看看是否是我們想要的結(jié)果。下面是運(yùn)行結(jié)果:

從這個結(jié)果能看出,它還包含了內(nèi)部 p 節(jié)點(diǎn)的內(nèi)容,也就是說 text 方法把所有純文本都提取出來了。若想去掉 p 節(jié)點(diǎn)內(nèi)部的文本,一種做法是先提取 p 節(jié)點(diǎn)內(nèi)的文本,再從整個結(jié)果里移除這個子串,但這種做法顯然比較繁瑣。 這時就可以發(fā)揮 remove 方法的作用了,我們可以接著這樣操作:

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

首先我們選中 p 節(jié)點(diǎn),接著調(diào)用 remove() 方法把它移除掉。此時,wrap 節(jié)點(diǎn)內(nèi)部就只剩下“Hello, World”這句話了,之后利用 text() 方法就能把它提取出來。 此外,實(shí)際上還有不少節(jié)點(diǎn)操作的方法,像 append()、empty() 和 prepend() 等,這些方法的用法和 jQuery 完全相同。若想了解詳細(xì)用法,可以參考官方文檔:[http://pyquery.readthedocs.io/en/latest/api.html](http://pyquery.readthedocs.io/en/latest/api.html)

七、偽類選擇器

CSS 選擇器如此強(qiáng)大,一個重要原因是它支持豐富多樣的偽類選擇器。這些偽類選擇器能實(shí)現(xiàn)很多特殊的選擇功能,比如選擇第一個節(jié)點(diǎn)、最后一個節(jié)點(diǎn)、奇偶數(shù)節(jié)點(diǎn),以及包含特定文本的節(jié)點(diǎn)等。下面通過示例來具體說明:

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" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >second item</a></li>
             <li class="item-0 active"><a href="link3.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >fourth item</a></li>
             <li class="item-0"><a href="link5.html" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >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)

在這個示例里,我們運(yùn)用了 CSS3 的偽類選擇器,分別選中了第一個 li 節(jié)點(diǎn)、最后一個 li 節(jié)點(diǎn)、第二個 li 節(jié)點(diǎn)、第三個 li 節(jié)點(diǎn)之后的所有 li 節(jié)點(diǎn)、偶數(shù)位置的 li 節(jié)點(diǎn),以及包含“second”文本的 li 節(jié)點(diǎn)。 若你想了解 CSS 選擇器更多的用法,可以參考 [http://www.w3school.com.cn/css/index.asp](http://www.w3school.com.cn/css/index.asp)。

至此,pyquery 的常用用法就介紹完畢了。要是你還想了解更多內(nèi)容,可查閱 pyquery 的官方文檔:[http://pyquery.readthedocs.io](http://pyquery.readthedocs.io)。我們相信,有了 pyquery 的助力,網(wǎng)頁解析將不再困難。

到此這篇關(guān)于Python解析庫pyquery 的使用詳解的文章就介紹到這了,更多相關(guān)Python pyquery 使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python OpenCV特征檢測之特征匹配方式詳解

    Python OpenCV特征檢測之特征匹配方式詳解

    OpenCV中提供了兩種技術(shù)用于特征匹配,分別為Brute-Force匹配器和基于FLANN的匹配器。本文將為大家詳細(xì)介紹一下這兩種匹配方式,需要的可以參考一下
    2021-12-12
  • 使用pygame模塊編寫貪吃蛇的實(shí)例講解

    使用pygame模塊編寫貪吃蛇的實(shí)例講解

    下面小編就為大家分享一篇使用pygame模塊編寫貪吃蛇的實(shí)例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • 集調(diào)試共享及成本控制Prompt工具PromptLayer使用指南

    集調(diào)試共享及成本控制Prompt工具PromptLayer使用指南

    這篇文章主要介紹了集調(diào)試共享及成本控制Prompt工具PromptLayer使用指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • python如何用columns參數(shù)獲取DataFrame各列的表頭名

    python如何用columns參數(shù)獲取DataFrame各列的表頭名

    這篇文章主要介紹了python如何用columns參數(shù)獲取DataFrame各列的表頭名問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • python 生成任意形狀的凸包圖代碼

    python 生成任意形狀的凸包圖代碼

    這篇文章主要介紹了python 生成任意形狀的凸包圖代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 詳解pytest中runtestprotocol方法的實(shí)現(xiàn)

    詳解pytest中runtestprotocol方法的實(shí)現(xiàn)

    runtestprotocol 是 pytest 執(zhí)行測試流程中的一個核心函數(shù),它主要負(fù)責(zé)調(diào)用測試函數(shù)的“setup”、“call”和“teardown”鉤子函數(shù),并生成對應(yīng)的測試報(bào)告,本文將深入探究pytest中runtestprotocol方法的實(shí)現(xiàn),需要的朋友可以參考下
    2023-10-10
  • 利用Anaconda創(chuàng)建虛擬環(huán)境的全過程

    利用Anaconda創(chuàng)建虛擬環(huán)境的全過程

    因?yàn)槎啻沃匦屡渲铆h(huán)境,這些命令每次都要用,每次都忘記,需要重新搜索,所以記錄這一過程,下面這篇文章主要給大家介紹了關(guān)于利用Anaconda創(chuàng)建虛擬環(huán)境的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Python使用內(nèi)置json模塊解析json格式數(shù)據(jù)的方法

    Python使用內(nèi)置json模塊解析json格式數(shù)據(jù)的方法

    這篇文章主要介紹了Python使用內(nèi)置json模塊解析json格式數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Python使用內(nèi)置的json模塊實(shí)現(xiàn)json格式數(shù)據(jù)的解析、轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • 利用Python優(yōu)雅的登錄校園網(wǎng)

    利用Python優(yōu)雅的登錄校園網(wǎng)

    這篇文章主要介紹了如何利用Python優(yōu)雅的登錄校園網(wǎng),幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-10-10
  • 對pytorch中不定長序列補(bǔ)齊的操作

    對pytorch中不定長序列補(bǔ)齊的操作

    這篇文章主要介紹了對pytorch中不定長序列補(bǔ)齊的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05

最新評論