天天看點

Python爬蟲(七)—類似jquery的 解析庫 pyquery

前言

以下關于pyquery 的學習,主要記錄常用的知識點,深入了解的檢視官方文檔。

pyquery : https://pyquery.readthedocs.io/en/latest/
JQuery : http://jquery.cuishifeng.cn/

本文參照部落格:https://www.cnblogs.com/zhaof/p/6935473.html

pyquery

pyquery允許您對xml文檔進行jquery查詢。API盡可能與jquery類似。pyquery使用lxml進行快速xml和html操作。

pip install pyquery -i https://pypi.tuna.tsinghua.edu.cn/simple/

from pyquery import PyQuery as pq

<class ‘pyquery.pyquery.PyQuery’>對象

  • 字元串初始化

    print(doc(‘li’))

    doc其實就是一個pyquery對象,我們可以通過doc可以進行元素的選擇,其實這裡就是一個css選擇器,是以CSS選擇器的規則都可以用,直接doc(标簽名)就可以擷取所有的該标簽的内容,如果想要擷取class 則doc(’.class_name’),如果是id則doc(’#id_name’)

  • URL初始化

    在pq()這裡可以傳入url參數也可以傳入檔案參數,當然這裡的檔案通常是一個html檔案,例如:pq(filename=‘index.html’)

from pyquery import PyQuery as pq

# 字元串初始化
html = '''
<div id="container">
    <ul class="list">
         <li class="item-1">one item</li>
         <li class="item-0 active" ><a href="link3.html"><span class="bold">two item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
     </ul>
</div>
'''
doc = pq(html)
print(doc)
print(type(doc))
print(doc('li'))

# URL初始化
doc = pq(url="http://www.baidu.com",encoding='utf-8')
print(doc('head'))
           

CSS選擇器

  • 樣例

    需要注意的是:

    • 第二第三個li會保留前面的空格。
    • doc(’#container .list li’),這裡的三者之間的并不是必須要挨着,隻要是層級關系就可以
html = '''
<div id="container">
    <ul class="list">
         <li class="item-1">one item</li>
         <li class="item-0 active" ><a href="link3.html"><span class="bold">two item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
     </ul>
</div>
'''
doc = pq(html)
print(doc('#container .list li'))
"""
<li class="item-1">one item</li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">two item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
"""
           

下面是常用的CSS選擇器方法:

寫法 樣例 含義
* * 選擇所有元素
.class .color class="color"的所有元素
#id #info id="info"的所有元素
element p 選擇所有p标簽元素
element,element div,p 選擇所有div标簽和所有p标簽元素
element element div p 選擇所有div标簽下的所有p标簽元素
[attribute] [class] [style] 選擇含有class屬性下帶有style屬性的元素
[attribute=value] [class=“test”] [style] 選擇含有class屬性為test下帶有style屬性的元素
  • 子元素

    children,find

    如下代碼:

    doc = pq(html)
    items = doc('.list')
    print(items)
    
    lis = items.find('li')
    print(lis)
    
    li = items.children()
    # 在children裡也可以用CSS選擇器
    li2 = items.children('.active') print(li2)
               

    可以看出通過pyquery找到結果其實還是一個pyquery對象,可以繼續查找,上述中的代碼中的items.find(‘li’) 則表示查找ul裡的所有的li标簽。

    通過children可以實作同樣的效果,并且通過.children方法得到的結果也是一個pyquery對象。

  • 父元素

    parent: 父元素的内容

    parents: 最上層父節點資訊即祖先節點的資訊

    items = doc(’.list’)

    container = items.parent()

    parents = items.parents()

    .parents查找的時候也可以添加css選擇器來進行内容的篩選

  • 兄弟元素

    siblings

    li = doc(’.list .item-0.active’)

    print(li.siblings())

    doc(’.list .item-0.active’) 中的.tem-0和.active是緊挨着的,是以表示是并的關系,這樣滿足條件的就剩下一個了:thired item的那個标簽了

    通過.siblings就可以擷取所有的兄弟标簽,當然這裡是不包括自己的

    在.siblings()裡也是可以通過CSS選擇器進行篩選

周遊

doc = pq(html)

lis = doc('li').items()
print(type(lis))
for li in lis:
    print(li)
"""
<class 'generator'>
<li class="item-1">one item</li>
         
<li class="item-0 active"><a href="link3.html"><span class="bold">two item</span></a></li>
         
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
"""
           

通過items()可以得到一個生成器,并且我們通過for循環得到的每個元素依然是一個pyquery對象。

需要注意的是,每個li都隔着一個空行,這是由于html每個li單獨一行的原因。但是lis還是隻有三個而并非六個

擷取資訊

  • 擷取屬性

    pyquery對象.attr(屬性名)

    pyquery對象.attr.屬性名

from pyquery import PyQuery as pq

html = '''
<div id="container">
    <ul class="list">
         <li class="item-1">one item</li>
         <li class="item-0 active" ><a href="link3.html"><span class="bold">two item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
     </ul>
</div>
'''
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">two item</span></a>
link3.html
link3.html
"""
           
  • 擷取文本

    .text()

  • 擷取html

    .html()的方式可以擷取目前标簽所包含的html資訊

doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.text())
print(a.html())
"""
<a href="link3.html"><span class="bold">two item</span></a>
two item
<span class="bold">two item</span>
"""
           

DOM操作

内容略,需要可直接檢視官方文檔:https://pyquery.readthedocs.io/en/latest/manipulating.html

個人部落格:Loak 正 - 關注人工智能及網際網路的個人部落格

文章位址:Python爬蟲(七)—類似jquery的 解析庫 pyquery