1. 程式人生 > >PyQuery庫使用詳解

PyQuery庫使用詳解

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

官方文件
http://pyquery.readthedocs.io/