1. 程式人生 > >【Python3 爬蟲學習筆記】解析庫的使用 10 —— 使用pyquery 3

【Python3 爬蟲學習筆記】解析庫的使用 10 —— 使用pyquery 3

節點操作

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>

可以看到,一共輸出了3次。第二次輸出時,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()方法是移除,有時會為資訊的提取帶來非常大的便利。

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

這裡直接先嚐試提取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()方法提取即可。
另外,其實還有很多節點操作的方法,比如append()、empty()和prepend()等方法,它們和jQuery的用法完全一致。