PyQuery庫也是一個非常強大又靈活的網頁解析庫,如果你有前端開發經驗的,都應該接觸過jQuery,那么PyQuery就是你非常絕佳的選擇,PyQuery 是 Python 仿照 jQuery 的嚴格實現。語法與 jQuery 幾乎完全相同,所以不用再去費心去記一些奇怪的方法了。
官網地址:http://pyquery.readthedocs.io/en/latest/
jQuery參考文檔: http://jquery.cuishifeng.cn/
初始化
初始化的時候一般有三種傳入方式:傳入字符串,傳入url,傳入文件
字符串初始化
html = ''' <div> <ul> <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> ''' from pyquery import PyQuery as pq doc = pq(html) print(doc) print(type(doc)) print(doc('li'))
結果如下:
由於PyQuery寫起來比較麻煩,所以我們導入的時候都會添加別名:
from pyquery import PyQuery as pq
這里我們可以知道上述代碼中的doc其實就是一個pyquery對象,我們可以通過doc可以進行元素的選擇,其實這里就是一個css選擇器,所以CSS選擇器的規則都可以用,直接doc(標簽名)就可以獲取所有的該標簽的內容,如果想要獲取class 則doc('.class_name'),如果是id則doc('#id_name')....
URL初始化
from pyquery import PyQuery as pq doc = pq(url="http://www.baidu.com",encoding='utf-8') print(doc('head'))
文件初始化
我們在pq()這里可以傳入url參數也可以傳入文件參數,當然這里的文件通常是一個html文件,例如:pq(filename='index.html')
基本的CSS選擇器
html = ''' <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> ''' from pyquery import PyQuery as pq doc = pq(html) print(doc('#container .list li'))
這里我們需要注意的一個地方是doc('#container .list li'),這里的三者之間的並不是必須要挨着,只要是層級關系就可以,下面是常用的CSS選擇器方法:
查找元素
子元素
children,find
代碼例子:
html = ''' <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> ''' 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)
運行結果如下
從結果里我們也可以看出通過pyquery找到結果其實還是一個pyquery對象,可以繼續查找,上述中的代碼中的items.find('li') 則表示查找ul里的所有的li標簽
當然這里通過children可以實現同樣的效果,並且通過.children方法得到的結果也是一個pyquery對象
li = items.children() print(type(li)) print(li)
同時在children里也可以用CSS選擇器
li2 = items.children('.active') print(li2)
父元素
parent,parents方法
通過.parent就可以找到父元素的內容,例子如下:
html = ''' <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> ''' from pyquery import PyQuery as pq doc = pq(html) items = doc('.list') container = items.parent() print(type(container)) print(container)
通過.parents就可以找到祖先節點的內容,例子如下:
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) items = doc('.list') parents = items.parents() print(type(parents)) print(parents)
結果如下:從結果我們可以看出返回了兩部分內容,一個是的父節點的信息,一個是父節點的父節點的信息即祖先節點的信息
同樣我們通過.parents查找的時候也可以添加css選擇器來進行內容的篩選
兄弟元素
siblings
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('.list .item-0.active') print(li.siblings())
代碼中doc('.list .item-0.active') 中的.tem-0和.active是緊挨着的,所以表示是並的關系,這樣滿足條件的就剩下一個了:thired item的那個標簽了
這樣在通過.siblings就可以獲取所有的兄弟標簽,當然這里是不包括自己的
同樣的在.siblings()里也是可以通過CSS選擇器進行篩選
遍歷
單個元素
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) lis = doc('li').items() print(type(lis)) for li in lis: print(type(li)) print(li)
運行結果如下:從結果中我們可以看出通過items()可以得到一個生成器,並且我們通過for循環得到的每個元素依然是一個pyquery對象。
獲取信息
獲取屬性
pyquery對象.attr(屬性名)
pyquery對象.attr.屬性名
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) a = doc('.item-0.active a') print(a) print(a.attr('href')) print(a.attr.href)
所以這里我們也可以知道獲得屬性值的時候可以直接a.attr(屬性名)或者a.attr.屬性名
獲取文本
在很多時候我們是需要獲取被html標簽包含的文本信息,通過.text()就可以獲取文本信息
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) a = doc('.item-0.active a') print(a) print(a.text())
結果如下:
獲取html
我們通過.html()的方式可以獲取當前標簽所包含的html信息,例子如下:
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) print(li.html())
結果如下:
DOM操作
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)
attr,css
同樣的我們可以通過attr給標簽添加和修改屬性,
如果之前沒有該屬性則是添加,如果有則是修改
我們也可以通過css添加一些css屬性,這個時候,標簽的屬性里會多一個style屬性
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.attr('name', 'link') print(li) li.css('font-size', '14px') print(li)
結果如下:
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()) wrap.find('p').remove() print(wrap.text())
結果如下:
pyquery中DOM的其他api操作參考:
http://pyquery.readthedocs.io/en/latest/api.html