python爬蟲pyquery庫詳解

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

基本的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選擇器方法:

查找元素

子元素
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())
複製代碼

結果以下:

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())
複製代碼

結果以下:

pyquery中DOM的其餘api操做參考:
http://pyquery.readthedocs.io/en/latest/api.html

博客參考:https://www.cnblogs.com/zhaof/p/6935473.html

相關文章
相關標籤/搜索