python parser。
?
lambda python、?
?
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('--------------------') print(type(doc)) print('--------------------') print(doc('li'))
?
結果如下:
<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> -------------------- <class 'pyquery.pyquery.PyQuery'> -------------------- <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>
由于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 pqdoc = pq(url="http://www.baidu.com",encoding='utf-8') print(doc('head'))
?
?
文件初始化
from pyquery import PyQuery as pqdoc = pq(filename='demo.html') print(doc('li'))
?
我們在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'))
?結果:
<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>
?li 不一定是 .list 的子節點,但一定是子孫節點
這里我們需要注意的一個地方是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('------------------------') print(items) print('------------------------') lis = items.find('li') print(type(lis)) print('------------------------') print(lis) print('------------------------')?
?運行結果如下:
<class 'pyquery.pyquery.PyQuery'> ------------------------ <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>------------------------ <class 'pyquery.pyquery.PyQuery'> ------------------------ <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>------------------------
從結果里我們也可以看出通過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)
?
?結果如下:從結果我們可以看出返回了兩部分內容,一個是的父節點的信息,一個是父節點的父節點的信息即祖先節點的信息
<class 'pyquery.pyquery.PyQuery'> <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><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>
同樣我們通過.parents查找的時候也可以添加css選擇器來進行內容的篩選
parent = items.parents('.wrap') print(parent)
?
結果:
<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>
?
兄弟元素
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())
?結果:
<li class="item-1"><a href="link2.html">second item</a></li><li class="item-0">first item</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>
代碼中doc('.list .item-0.active') 中的.tem-0和.active是緊挨著的,所以表示是并列的關系,這樣滿足條件的就剩下一個了:thired item的那個標簽了
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('.active'))
?
結果:
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
這樣在通過.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對象。
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>-------------------------- <class 'generator'> <class 'pyquery.pyquery.PyQuery'> <li class="item-0">first item</li><class 'pyquery.pyquery.PyQuery'> <li class="item-1"><a href="link2.html">second item</a></li><class 'pyquery.pyquery.PyQuery'> <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><class 'pyquery.pyquery.PyQuery'> <li class="item-1 active"><a href="link4.html">fourth item</a></li><class 'pyquery.pyquery.PyQuery'> <li class="item-0"><a href="link5.html">fifth item</a></li>
?
獲取信息
獲取屬性
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 href="link3.html"><span class="bold">third item</span></a> link3.html link3.html
所以這里我們也可以知道獲得屬性值的時候可以直接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())
?結果:
<a href="link3.html"><span class="bold">third item</span></a> third item
?
?
獲取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(‘------------------’) print(li.html())
?
?結果如下:
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>------------------- <a href="link3.html"><span class="bold">third item</span></a>
?
?
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) print('---------------') li.removeClass('active') print(li) print('---------------') li.addClass('active') print(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>
?
?
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) print('---------------') li.attr('name', 'link') print(li) print('---------------') li.css('font-size', '14px') print(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" style="font-size: 14px"><a href="link3.html"><span class="bold">third item</span></a></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())
print('----------------') wrap.find('p').remove() print(wrap.text())
??結果如下:
Hello, World This is a paragraph. ----------------- Hello, World
?
pyquery中DOM的其他api操作參考:
http://pyquery.readthedocs.io/en/latest/api.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('li:first-child') #獲取第一個li標簽 print(li) print('-----------------------') li = doc('li:last-child') #獲取最后一個li標簽 print(li) print('-----------------------') li = doc('li:nth-child(2)') #獲取第二個li標簽 計數從0開始 print(li) print('-----------------------') li = doc('li:gt(2)') #獲取比二大的li標簽 print(li) print('-----------------------') li = doc('li:nth-child(2n)') #獲取偶數的li標簽 print(li) print('-----------------------') li = doc('li:contains(second)') #獲取包含second文本的li標簽 print(li)
?
結果:
<li class="item-0">first item</li>----------------------- <li class="item-0"><a href="link5.html">fifth item</a></li>----------------------- <li class="item-1"><a href="link2.html">second item</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>----------------------- <li class="item-1"><a href="link2.html">second item</a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li>----------------------- <li class="item-1"><a href="link2.html">second item</a></li>
?更多CSS選擇器可以查看??http://www.w3school.com.cn/css/index.asp
http://www.w3school.com.cn/
?
原文:https://www.cnblogs.com/zhaof/p/6935473.html
?