一:簡介css
PyQuery庫是jQuery的Python實現,能夠用於解析HTML網頁內容,是一個很是強大又靈活的網頁解析庫。html
--》官方文檔地址python
--》jQuery參考文檔jquery
二:初始化api
初始化的時候通常有三種傳入方式:傳入字符串,傳入url,傳入文件。ui
(1):字符串初始化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('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> ##################
注意:spa
因爲PyQuery寫起來比較麻煩,因此咱們導入的時候都會添加別名:
from pyquery import PyQuery as pqcode
這裏咱們能夠知道上述代碼中的doc其實就是一個pyquery對象,咱們能夠經過doc能夠進行元素的選擇,其實這裏就是一個css選擇器,因此CSS選擇器的規則均可以用,直接doc(標籤名)就能夠獲取全部的該標籤的內容,若是想要獲取class 則doc('.class_name'),若是是id則doc('#id_name')....htm
(2):url初始化
from pyquery import PyQuery as pq doc = pq(url='http://www.baidu.com') print(doc('head'))
(3):文件初始化
from pyquery import PyQuery as pq doc = 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'))
注意:
doc('#container .list li'),這裏的三者之間的並非必需要挨着,只要是層級關係就能夠,下面是經常使用的CSS選擇器方法:
(1):查找元素
子元素:
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) #####################運行結果 <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就能夠找到父元素的內容:
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選擇器來進行內容的篩選
兄弟元素:
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選擇器進行篩選
(2):遍歷
單個元素:
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() # 經過items()能夠獲得一個生成器,而且經過循環獲得每一個元素 print(type(lis)) for li in lis: print(type(li)) print(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.attr(屬性名)或者a.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.text()) # 經過.text()就能夠獲取文本信息
獲取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()) # 經過.html()的方式能夠獲取當前標籤所包含的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())
五:官方api整理-->api
使用方法
from pyquery import PyQuery as pq
1.可加載一段HTML字符串,或一個HTML文件,或是一個url地址,
例:
d=pq("<html><title>hello</title></html>")
d=pq(filename=path_to_html_file)
d=pq(url='http://www.baidu.com')注意:此處url彷佛必須寫全
2.html()和text() ——獲取相應的HTML塊或文本塊,
例:
p=pq("<head><title>hello</title></head>")
p('head').html()#返回<title>hello</title>
p('head').text()#返回hello
3.根據HTML標籤來獲取元素,
例:
d=pq('<div><p>test 1</p><p>test 2</p></div>')
d('p')#返回[<p>,<p>]
print d('p')#返回<p>test 1</p><p>test 2</p>
print d('p').html()#返回test 1
注意:當獲取到的元素不僅一個時,html()、text()方法只返回首個元素的相應內容塊
4.eq(index) ——根據給定的索引號獲得指定元素
接上例,若想獲得第二個p標籤內的內容,則能夠:
print d('p').eq(1).html() #返回test 2
5.filter() ——根據類名、id名獲得指定元素,例:
d=pq("<div><p id='1'>test 1</p><p class='2'>test 2</p></div>")
d('p').filter('#1') #返回[<p#1>]
d('p').filter('.2') #返回[<p.2>]
6.find() ——查找嵌套元素,例:
d=pq("<div><p id='1'>test 1</p><p class='2'>test 2</p></div>")
d('div').find('p')#返回[<p#1>, <p.2>]
d('div').find('p').eq(0)#返回[<p#1>]
7.直接根據類名、id名獲取元素,例:
d=pq("<div><p id='1'>test 1</p><p class='2'>test 2</p></div>")
d('#1').html()#返回test 1
d('.2').html()#返回test 2
8.獲取屬性值,例:
d=pq("<p id='my_id'><a href='http://hello.com'>hello</a></p>")
d('a').attr('href')#返回http://hello.com
d('p').attr('id')#返回my_id
9.修改屬性值,例:
d('a').attr('href', 'http://baidu.com')把href屬性修改成了baidu
10.addClass(value) ——爲元素添加類,例:
d=pq('<div></div>')
d.addClass('my_class')#返回[<div.my_class>]
11.hasClass(name) #返回判斷元素是否包含給定的類,例:
d=pq("<div class='my_class'></div>")
d.hasClass('my_class')#返回True
12.children(selector=None) ——獲取子元素,例:
d=pq("<span><p id='1'>hello</p><p id='2'>world</p></span>")
d.children()#返回[<p#1>, <p#2>]
d.children('#2')#返回[<p#2>]
13.parents(selector=None)——獲取父元素,例:
d=pq("<span><p id='1'>hello</p><p id='2'>world</p></span>")
d('p').parents()#返回[<span>]
d('#1').parents('span')#返回[<span>]
d('#1').parents('p')#返回[]
14.clone() ——返回一個節點的拷貝
15.empty() ——移除節點內容
16.nextAll(selector=None) ——返回後面所有的元素塊,例:
d=pq("<p id='1'>hello</p><p id='2'>world</p><img scr='' />")
d('p:first').nextAll()#返回[<p#2>, <img>]
d('p:last').nextAll()#返回[<img>]
17.not_(selector) ——返回不匹配選擇器的元素,例:d=pq("<p id='1'>test 1</p><p id='2'>test 2</p>")d('p').not_('#2')#返回[<p#1>]