Skip to content

pyquery 簡介

pyquery 是與jquery類似的選擇器語法,可以方便的剖析網頁
基本用法為

import requests
from pyquery import PyQuery as pq
res = requests.get(url)
doc = pq(res.text)

得到pyquery物件,pyquery物件可以直接選擇元素,比如
title = doc(‘h1’)
並且由於回傳仍為pyquery物件(chaining特性),因此可以連續選取 比如 doc(‘h1’)('#ID’)
或套用其他method

選擇器語法

  1. 選取元素、class、id:
    (‘element’)
    如doc(‘h1’)
    ('.class’)
    如doc('.div’)
    ('#id’) 如doc('#main’)

  2. 選取屬性
    .attr(‘attribute’)
    常用: doc(‘a’).attr(‘href’)

  3. 子孫與child doc(‘A B’) 表示在A裡的B doc(‘A>B’) 表示在A下一層的B

  4. 取得文字 .text()
    比如 doc(‘a’).text()

  5. html格式
    .html()

  • Note: pyquery物件與htmlElemnt物件 前者是pq(‘’)選擇完後會回傳
    可以再選擇、attr(‘…’)、.size()、.html()、.text()
    等等

後者包含於前者中,如果將pq物件取出一個如:doc[0],就會得到htmlElement物件
有.text、.attrib[‘href’] …等等
但目前會將pq(後者)轉成前者再使用方便的函式

實作上遇到的問題 (可能有更好的解法)

如何判斷爬取到的tag內是否為空

問題描述: 爬取ptt文章時,會有文章被刪除,我們希望如果被刪除可以判斷並跳過他
文章被刪除後,其外面tag還在,但裡面資訊會消失
解法:使用size函式
doc('.article’).size() == 0 則該文章被刪除

如何取第n個tag

問題描述: 爬取網頁時,常常需要第n個div的資料
解法: 使用eq函式
doc(‘h1’).eq(3) 會得到第三個標題

取交集

問題描述: 可能需要 是標題且id為xxx的資料
解法: 連取即可
doc(‘h1’)('#xxx’)

  • 注意 doc(‘h1 #xxx’) 與 doc(‘h1’)(#xxx) 不同
    前者是 在 h1 裡的#xxx
    後者是 既為h1又為#xxx的

搭配list comprehension

很簡潔厲害的寫法
items = [item.text() for item in doc.items(‘li’)]

參考

政大林哲緯老師課程