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>
節點操作
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節點的內容。
可以看到,一共輸出了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節點。
可以發現,呼叫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())