PyQuery庫使用詳解
阿新 • • 發佈:2018-11-01
PyQuery是python中一個強大而又靈活的網頁解析庫,如果你覺得正則寫起來太麻煩,又覺得BeautifulSoup語法太難記,如果你熟悉jQuery的語法那麼,PyQuery就是你絕佳的選擇。
安裝:pip3 install pyquery
一、初始化
下面介紹三種初始化PyQuery的方法。
1.字串初始化
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#習慣寫法,用字母pq來代替PyQuery類
doc = pq(html)#宣告PyQuery物件doc,傳入html這個引數(字串)
print(doc('li'))#用css選擇器來實現,如果要選id前面加#,如果選class,前面加.,如果選標籤名,什麼也不加
如圖,所以li標籤內容被選擇,並將內容打印出來。
2. URL初始化
from pyquery import PyQuery as pq
doc=pq(url='http://www.baidu.com')#直接請求傳入的url
print(doc('head' ))
選擇出了head標籤。
3.檔案初始化
from pyquery import PyQuery as pq
doc=pq(filename='demo.html')#指定檔名,該檔案在執行目錄下
print(doc('head'))
二、基本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'))
#會查詢id為container class為list,標籤為li的物件,只是層級關係,後者並非一定是前者的子物件
#注意用空格隔開
三、查詢元素
查詢子元素
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')#拿到items,裡面選擇了list類
print(type(items))
print(items)
lis = items.find('li')#利用find方法,查詢items裡面的li標籤,得到的lis也可以繼續呼叫find方法往下查詢,層層剝離
print(type(lis))
print(lis)
打印出來的內容如上圖,上方的是list類中的所有內容,下方的是類中所有li標籤的內容。
也可以用**.children()**查詢直接子元素:
items = doc('.list')
lis = items.children()
print(type(lis))
print(lis)
lis = items.children('.active')
print(lis)
查詢父元素
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()#.parent()查詢物件的父元素
print(type(container))
print(container)
list類的父節點是container,被全部打印出來了。
祖先節點
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()#.parents()查詢所有的祖先節點
parent = items.parents('.wrap')#可以傳入引數,再次進行篩選
print(parent)
找出所有祖先節點中,類為wrap的節點。
兄弟元素
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())#.siblings()兄弟元素,即同級別的元素,不包括自己
如圖,選出了4個兄弟元素。
當然啦,還可以從結果裡再次進行篩選:
print(li.siblings('.active'))#
四、遍歷
如果查詢的結果有多個元素,並且你想對每一個都進行操作,那麼就要用到遍歷了。遍歷的關鍵就是items。
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)
lis = doc('li').items()#.items會是一個生成器,可以用來遍歷
print(type(lis))
for li in lis:
print(li)
五、獲取資訊
獲取屬性
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')#選出同時具備這item-0,active兩個資訊的標籤 空格表示這個標籤內層的標籤
print(a)
print(a.attr('href'))#a標籤的href屬性的內容,也就是一個超連結
print(a.attr.href)#另一種寫法
獲取文字
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')#選出同時具備這item-0,active兩個資訊的標籤 空格表示這個標籤內層的標籤
print(a)
print(a.text())#獲取該標籤中的內容
獲取HTML
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')#選中一個li標籤
print(li)
print(li.html())#獲得該標籤中的html內容
六、DOM操作
對節點進行一些操作。這部分有許多的API,這裡舉一些例子。
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')#刪除active這個class屬性
print(li)
li.addClass('active')#增加
print(li)
attr、css
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.attr('name','link')#如果不存在,就會向標籤中新增一個內容為link的name屬性,如果存在,那就改變之
print(li)
li.css('font-size','14px')#增加一個css
print(li)
remove
看下面的一段html,我們想要單獨獲得“Hello World”內容,但是和他並列的還有另外的內容,如果我們直接選中wrap標籤然後.text,那麼會獲取兩段內容。這時候可以先用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()#找到p標籤然後刪除
print(wrap.text())
紅框中的是刪除之前的內容。刪除之後就可以單獨取得程式碼之祖:“Hello World”啦!
其他DOM方法
其他DOM方法
http://pyquery.readthedocs.io/en/latest/api.html
以上網址列出了所以的API,有需求時可檢視。
#七、偽類選擇器
根據自身需要(順序之類的),選擇指定的標籤。
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)
li = doc('li:last-child')
print(li)
li = doc('li:nth-child(2)')#獲取第2個li標籤
print(li)
li = doc('li:gt(2)')#獲取索引2個以後的li標籤。注意!索引是從0開始的
print(li)
li = doc('li:nth-child(2n)')#獲取第偶數個的li標籤
print(li)
li = doc('li:contains(second)')#查詢包含"second"文字的li標籤
print(li)
更多CSS選擇器可以檢視 http://www.w3school.com.cn/css/index.asp