最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python解析庫(kù)pyquery 的使用詳解

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

前言

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

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

一、pyquery 初始化

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

1.1 字符串初始化

咱們先通過(guò)一個(gè)實(shí)際例子來(lái)體驗(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對(duì)象,給它取個(gè)pq的別名。接著弄了個(gè)很長(zhǎng)的HTML字符串,把這個(gè)字符串作為參數(shù),傳給PyQuery類,這樣就完成了初始化。初始化完之后,再把得到的對(duì)象放到CSS選擇器里。在這個(gè)例子里,我們輸入li節(jié)點(diǎn),這么一來(lái),就能選中所有的li節(jié)點(diǎn)了 。

1.2 URL 初始化

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

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

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

<title>攻城獅7號(hào)-CSDN博客</title>

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

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

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)然啦,初始化的時(shí)候,除了能傳一個(gè)URL,要是你想傳本地的文件名也是可以的,只要把參數(shù)指定成filename就行:

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

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

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

二、基本 CSS 選擇器

咱們先通過(guò)一個(gè)實(shí)際例子,來(lái)體驗(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對(duì)象,接著輸入了一個(gè)CSS選擇器#container .list li 。這個(gè)選擇器的意思是,先找到id是container的節(jié)點(diǎn),再?gòu)倪@個(gè)節(jié)點(diǎn)里面,找到class是list的節(jié)點(diǎn),最后把這個(gè)list節(jié)點(diǎn)里面所有的li節(jié)點(diǎn)選出來(lái)。然后我們把選出來(lái)的結(jié)果打印出來(lái),能看到,確實(shí)成功找到了符合條件的節(jié)點(diǎn)。 最后呢,我們把選出來(lái)結(jié)果的類型也打印出來(lái)。可以看到,它還是PyQuery類型 。

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

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

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

要是想查找子節(jié)點(diǎn),就得用find方法,這個(gè)方法的參數(shù)是CSS選擇器。咱們還是拿上面那個(gè)HTML做例子來(lái)說(shuō):

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)去,這樣就選中了這個(gè)節(jié)點(diǎn)里面的li節(jié)點(diǎn),最后把結(jié)果打印出來(lái)??梢钥吹剑琭ind()方法會(huì)把所有符合條件的節(jié)點(diǎn)都選出來(lái),選出來(lái)的結(jié)果是PyQuery類型。 實(shí)際上,find方法會(huì)在節(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)來(lái)說(shuō),可以給children()方法傳入CSS選擇器.active。

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

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

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

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

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

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方法,就能得到這個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn),這個(gè)父節(jié)點(diǎn)也是PyQuery類型。 這里得到的父節(jié)點(diǎn)是直接的父節(jié)點(diǎn),不會(huì)再去查父節(jié)點(diǎn)的父節(jié)點(diǎn),也就是不會(huì)找祖先節(jié)點(diǎn)。 要是想獲取某個(gè)祖先節(jié)點(diǎn),該咋整呢?這時(shí)候就可以用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é)果有倆:一個(gè)是class為wrap的節(jié)點(diǎn),另一個(gè)是id為container的節(jié)點(diǎn)。這說(shuō)明,parents()方法會(huì)把所有的祖先節(jié)點(diǎn)都返回。 要是想篩選出某個(gè)祖先節(jié)點(diǎn),就可以給parents方法傳入CSS選擇器,這樣就能得到祖先節(jié)點(diǎn)里符合這個(gè)CSS選擇器的節(jié)點(diǎn)。

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

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

從輸出結(jié)果能明顯看出來(lái),少了一個(gè)節(jié)點(diǎn),現(xiàn)在只剩下class是wrap的那個(gè)節(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代碼來(lái)說(shuō)明:

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),也就是第三個(gè)li節(jié)點(diǎn)。顯然,它有4個(gè)兄弟節(jié)點(diǎn),分別是第一個(gè)、第二個(gè)、第四個(gè)和第五個(gè)li節(jié)點(diǎn)。

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

能看到,這就是我們剛才說(shuō)的那4個(gè)兄弟節(jié)點(diǎn)。 要是想篩選出某個(gè)兄弟節(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),通過(guò)剛才的結(jié)果可以觀察到,class 為 active 的兄弟節(jié)點(diǎn)只有第四個(gè) li 節(jié)點(diǎn),所以結(jié)果應(yīng)該是一個(gè)。我們?cè)倏匆幌逻\(yùn)行結(jié)果:

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

四、遍歷

剛才能看到,pyquery選擇出來(lái)的結(jié)果可能是多個(gè)節(jié)點(diǎn),也可能是單個(gè)節(jié)點(diǎn),但類型都是PyQuery類型,不會(huì)像Beautiful Soup那樣返回列表。 要是選出來(lái)的是單個(gè)節(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é)果有多個(gè)節(jié)點(diǎn),就得通過(guò)遍歷來(lái)獲取每個(gè)節(jié)點(diǎn)。就像這里,要遍歷每個(gè)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()方法后會(huì)得到一個(gè)生成器,對(duì)這個(gè)生成器進(jìn)行遍歷,就能逐個(gè)拿到li節(jié)點(diǎn)對(duì)象,這些對(duì)象也是PyQuery類型。每個(gè)li節(jié)點(diǎn)都能調(diào)用前面提到的方法來(lái)做選擇操作,像接著查找子節(jié)點(diǎn)、找某個(gè)祖先節(jié)點(diǎn)之類的,用起來(lái)很靈活。

五、獲取信息

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

5.1 獲取屬性

當(dāng)提取到一個(gè)PyQuery類型的節(jié)點(diǎn)后,就能調(diào)用attr()方法來(lái)獲取這個(gè)節(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),這個(gè)節(jié)點(diǎn)是PyQuery類型。 接著調(diào)用attr方法,在方法里傳入屬性名,就能得到對(duì)應(yīng)的屬性值。 另外,也能通過(guò)調(diào)用attr屬性來(lái)獲取屬性,具體用法如下:

print(a.attr.href)

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

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個(gè),打印結(jié)果也該是4個(gè)。但調(diào)用attr方法時(shí),返回的卻只有第一個(gè)節(jié)點(diǎn)的屬性。這是因?yàn)椋?dāng)返回結(jié)果包含多個(gè)節(jié)點(diǎn)時(shí),調(diào)用attr方法只能得到第一個(gè)節(jié)點(diǎn)的屬性。 要是遇到這種情況,想獲取所有a節(jié)點(diǎn)的屬性,就得用前面說(shuō)過(guò)的遍歷方法了。

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

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

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

5.2 獲取文本

提取到節(jié)點(diǎn)后,另一個(gè)重要操作就是獲取其內(nèi)部的文本內(nèi)容,這時(shí)調(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é)果:

這里先選中一個(gè)a節(jié)點(diǎn),接著調(diào)用text方法,就能獲取該節(jié)點(diǎn)內(nèi)部的文本信息。這時(shí)它會(huì)把節(jié)點(diǎn)內(nèi)部的所有HTML內(nèi)容忽略掉,只返回純文本。 不過(guò)要是想獲取這個(gè)節(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())

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

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

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

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

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

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

6.1 addClass 和 removeClass

那咱們先通過(guò)一個(gè)具體的實(shí)例來(lái)體驗(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)

先是選中了第三個(gè)li節(jié)點(diǎn),接著調(diào)用removeClass()方法,把li節(jié)點(diǎn)上的active這個(gè)class給去掉了,之后又調(diào)用了addClass()方法,再把這個(gè)class添加回來(lái)。每次執(zhí)行完一次操作,就把當(dāng)前l(fā)i節(jié)點(diǎn)的內(nèi)容打印輸出。 運(yùn)行后得到的結(jié)果如下:

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

6.2 attr、text、html

當(dāng)然,除了對(duì) class 屬性進(jìn)行操作外,還能使用 attr 方法操作其他屬性。另外,也可借助 text 和 html 方法來(lái)改變節(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方法的第一個(gè)參數(shù)是屬性名,第二個(gè)參數(shù)是屬性值。接著,我們又調(diào)用text和html方法來(lái)改變節(jié)點(diǎn)內(nèi)部的內(nèi)容。每次操作完成后,都會(huì)打印輸出當(dāng)前的li節(jié)點(diǎn)。 下面是運(yùn)行結(jié)果:

可以看出,調(diào)用attr方法后,li節(jié)點(diǎn)新增了一個(gè)原本不存在的屬性“name”,其值為“link”。隨后調(diào)用text方法并傳入文本,li節(jié)點(diǎn)內(nèi)部的文本就都變成了傳入的字符串文本。最后,調(diào)用html方法并傳入HTML文本,li節(jié)點(diǎn)內(nèi)部又變成了傳入的HTML文本。 由此可知,attr方法若只傳入第一個(gè)參數(shù)即屬性名,是用于獲取該屬性值;若傳入第二個(gè)參數(shù),則可用來(lái)修改屬性值。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”這個(gè)字符串,同時(shí)排除 p 節(jié)點(diǎn)內(nèi)部的字符串,該怎么做呢? 這里直接先試著提取 class 為 wrap 的節(jié)點(diǎn)的內(nèi)容,看看是否是我們想要的結(jié)果。下面是運(yùn)行結(jié)果:

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

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

首先我們選中 p 節(jié)點(diǎn),接著調(diào)用 remove() 方法把它移除掉。此時(shí),wrap 節(jié)點(diǎn)內(nèi)部就只剩下“Hello, World”這句話了,之后利用 text() 方法就能把它提取出來(lái)。 此外,實(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)大,一個(gè)重要原因是它支持豐富多樣的偽類選擇器。這些偽類選擇器能實(shí)現(xiàn)很多特殊的選擇功能,比如選擇第一個(gè)節(jié)點(diǎn)、最后一個(gè)節(jié)點(diǎn)、奇偶數(shù)節(jié)點(diǎn),以及包含特定文本的節(jié)點(diǎn)等。下面通過(guò)示例來(lái)具體說(shuō)明:

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)

在這個(gè)示例里,我們運(yùn)用了 CSS3 的偽類選擇器,分別選中了第一個(gè) li 節(jié)點(diǎn)、最后一個(gè) li 節(jié)點(diǎn)、第二個(gè) li 節(jié)點(diǎn)、第三個(gè) 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)頁(yè)解析將不再困難。

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

相關(guān)文章

  • numpy中hstack vstack stack concatenate函數(shù)示例詳解

    numpy中hstack vstack stack concatenate函數(shù)示例詳解

    這篇文章主要為大家介紹了numpy中hstack vstack stack concatenate函數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Python之torch.no_grad()函數(shù)使用和示例

    Python之torch.no_grad()函數(shù)使用和示例

    這篇文章主要介紹了Python之torch.no_grad()函數(shù)使用和示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Python整型運(yùn)算之布爾型、標(biāo)準(zhǔn)整型、長(zhǎng)整型操作示例

    Python整型運(yùn)算之布爾型、標(biāo)準(zhǔn)整型、長(zhǎng)整型操作示例

    這篇文章主要介紹了Python整型運(yùn)算之布爾型、標(biāo)準(zhǔn)整型、長(zhǎng)整型操作,結(jié)合具體實(shí)例形式分析了Python中布爾型、標(biāo)準(zhǔn)整型、長(zhǎng)整型等相關(guān)運(yùn)算技巧,代碼備有詳盡注釋,需要的朋友可以參考下
    2017-07-07
  • Python + Chrome抓取AJAX動(dòng)態(tài)數(shù)據(jù)的兩種方法

    Python + Chrome抓取AJAX動(dòng)態(tài)數(shù)據(jù)的兩種方法

    在現(xiàn)代 Web 開發(fā)中,AJAX技術(shù)被廣泛應(yīng)用于動(dòng)態(tài)加載數(shù)據(jù),使得網(wǎng)頁(yè)能夠在不刷新的情況下更新內(nèi)容,本文將詳細(xì)介紹 Python + Chrome 如何抓取 AJAX 動(dòng)態(tài)數(shù)據(jù),并提供兩種方法的完整實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2025-04-04
  • python3 配置logging日志類的操作

    python3 配置logging日志類的操作

    這篇文章主要介紹了python3 配置logging日志類的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • R vs. Python 數(shù)據(jù)分析中誰(shuí)與爭(zhēng)鋒?

    R vs. Python 數(shù)據(jù)分析中誰(shuí)與爭(zhēng)鋒?

    R和Python兩者誰(shuí)更適合數(shù)據(jù)分析領(lǐng)域?在某些特定情況下誰(shuí)會(huì)更有優(yōu)勢(shì)?還是一個(gè)天生在各方面都比另一個(gè)更好?
    2017-10-10
  • Python使用pyecharts創(chuàng)建交互式圖表的示例代碼

    Python使用pyecharts創(chuàng)建交互式圖表的示例代碼

    本文詳細(xì)介紹了如何使用Python的策略庫(kù)創(chuàng)建折線圖、柱狀圖、餅圖和散點(diǎn)圖,并演示了安裝、基礎(chǔ)圖表制作和配置,適合數(shù)據(jù)分析師和開發(fā)者學(xué)習(xí)數(shù)據(jù)可視化技術(shù),需要的朋友可以參考下
    2025-12-12
  • 使用Python實(shí)現(xiàn)為PDF文檔設(shè)置和移除密碼

    使用Python實(shí)現(xiàn)為PDF文檔設(shè)置和移除密碼

    在數(shù)字化時(shí)代,文檔的安全性變得越來(lái)越重要,特別是對(duì)于包含敏感信息的PDF文件,所以本文主要來(lái)和大家介紹一下如何使用Python實(shí)現(xiàn)為PDF文檔設(shè)置和移除密碼,需要的可以參考下
    2024-03-03
  • Python視頻處理模塊之moviepy的用法教程

    Python視頻處理模塊之moviepy的用法教程

    隨著自媒體時(shí)代,現(xiàn)在對(duì)視頻的處理變得越來(lái)越常見。而?Python?有一個(gè)專門用于處理視頻的第三方庫(kù):moviepy,可以非常方便地對(duì)視頻進(jìn)行一些簡(jiǎn)單處理,下面我們就來(lái)看一看
    2022-07-07
  • Pygame Event事件模塊的詳細(xì)示例

    Pygame Event事件模塊的詳細(xì)示例

    事件是Pygame的重要模塊之一,比如鼠標(biāo)點(diǎn)擊、鍵盤敲擊、游戲窗口移動(dòng)、調(diào)整窗口大小、觸發(fā)特定的情節(jié)、退出游戲等等,本文就詳細(xì)的介紹一下具體用法,感興趣的可以了解一下
    2021-11-11

最新評(píng)論

普格县| 大名县| 偃师市| 锦州市| 永修县| 曲麻莱县| 丹巴县| 正安县| 罗平县| 渝北区| 栾城县| 永靖县| 万全县| 腾冲县| 永福县| 罗甸县| 乳山市| 合山市| 太白县| 鹤壁市| 德庆县| 十堰市| 体育| 喀喇沁旗| 江口县| 浮梁县| 南陵县| 西丰县| 香格里拉县| 蒙城县| 张家港市| 和政县| 遂昌县| 安多县| 枝江市| 泽普县| 贞丰县| 左云县| 民县| 延寿县| 远安县|