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
選擇器語法
-
選取元素、class、id:
(‘element’)
如doc(‘h1’)
('.class’)
如doc('.div’)
('#id’) 如doc('#main’) -
選取屬性
.attr(‘attribute’)
常用: doc(‘a’).attr(‘href’) -
子孫與child doc(‘A B’) 表示在A裡的B doc(‘A>B’) 表示在A下一層的B
-
取得文字 .text()
比如 doc(‘a’).text() -
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’)]
參考
政大林哲緯老師課程