PyQuery庫也是一個很是強大又靈活的網頁解析庫,若是你有前端開發經驗的,都應該接觸過jQuery,那麼PyQuery就是你很是絕佳的選擇,PyQuery 是 Python 仿照 jQuery 的嚴格實現。語法與 jQuery 幾乎徹底相同,因此不用再去費心去記一些奇怪的方法了。css
官網地址:http://pyquery.readthedocs.io/en/latest/
jQuery參考文檔: http://jquery.cuishifeng.cn/html
初始化的時候通常有三種傳入方式:傳入字符串,傳入url,傳入文件前端
字符串初始化jquery
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'))
結果以下:api
因爲PyQuery寫起來比較麻煩,因此咱們導入的時候都會添加別名:
from pyquery import PyQuery as pqui
這裏咱們能夠知道上述代碼中的doc其實就是一個pyquery對象,咱們能夠經過doc能夠進行元素的選擇,其實這裏就是一個css選擇器,因此CSS選擇器的規則均可以用,直接doc(標籤名)就能夠獲取全部的該標籤的內容,若是想要獲取class 則doc('.class_name'),若是是id則doc('#id_name')....url
URL初始化spa
from pyquery import PyQuery as pq doc = pq(url="http://www.baidu.com",encoding='utf-8') print(doc('head'))
文件初始化code
咱們在pq()這裏能夠傳入url參數也能夠傳入文件參數,固然這裏的文件一般是一個html文件,例如:pq(filename='index.html')htm
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())
結果以下:
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
博客參考:https://www.cnblogs.com/zhaof/p/6935473.html