1. 程式人生 > >Pyquery物件中CSS用法

Pyquery物件中CSS用法

Pyquery物件中CSS選擇器的用法

首先將HTML轉為Pyquery物件在用css選擇器

doc = pq(html)
print(doc('#con .list li'))選id是con 然後在選內部 class為list 節點內部所有li節點
item = doc('.list') 

子節點
find()方法  item.find(‘li’)符合條件的所有子孫節點  
children()方法  item.children(‘.active’)進一步篩選     如果只差子節點 用此方法  

父節點
parent()返回直接的父節點
parents()返回所有的祖先節點

如果找某個特定的祖先節點 向parents()傳入CSS選擇器 item.parents('.wap')

兄弟節點
li = doc('.list .item-0.active')
li.siblings()會選出所有的兄弟節點 包括上兄弟和下兄弟 需要選特定某個兄弟 需要傳入CSS選擇器 li.siblings('.active')

遍歷  
多個節點需要遍歷出來
li = doc('li') 選到所有的li標籤 需要調items()方法返回的是generator型別
generator(生成器)是ES6標準引入的新的資料型別。一個generator看上去像一個函式,但可以返回多次


獲取資訊
獲取屬性
a = doc('a')
一、attr()方法獲取屬性 a.attr('href')   如果選的多個  attr()只返回第一個 也就是隻有第一個能被呼叫 要獲取全部需要遍歷
二、a.attr.href 返回全部

獲取文字
獲取a節點文字 a.text() 返回的是字串
若要獲取整個HTML文字 用html()方法
如果匹配到的是多個節點 text()獲取全部  html()只能獲取第一個 除非遍歷

偽類選擇器
li = doc('li:first-child') 第一個li節點
li = doc('li:last-child')  最後一個li節點
li = doc('li:nth-child(2)')第二個li節點
li = doc('li:gt(2)')  第三個li節點之後的li節點
li = doc('li:nth-child(2n)') 偶數位置的li節點
li = doc('li:cobtains(content)') 包含content文字的節點

li </span><span class="pun">=</span><span class="pln"> doc</span><span class="pun">(</span><span class="str">‘li:contains(second)‘</span><span class="pun">)</span>

節點操作

addClassremoveClass

我們先用例項來感受一下:

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節點的內容。

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

所以說,addClass()和removeClass()這些方法可以動態改變節點的class屬性。

attrtexthtml

當然,除了操作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節點。

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

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

 

 

remove()

顧名思義,remove()方法就是移除,它有時會為資訊的提取帶來非常大的便利。下面有一段HTML文字:

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

 

現在想提取Hello, World這個字串,而不要p節點內部的字串,需要怎樣操作呢?

這裡直接先嚐試提取class為wrap的節點的內容,看看是不是我們想要的。執行結果如下:

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

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

wrap.find(‘p‘).remove()

print(wrap.text())