Python爬虫利器六PyQuery的用法
你是否覺得 XPath 的用法多少有點晦澀難記呢? 你是否覺得 BeautifulSoup 的語法多少有些慳吝難懂呢? 你是否甚至還在苦苦研究正則表達式卻因為少些了一個點而抓狂呢? 你是否已經有了一些前端基礎了解選擇器卻與另外一些奇怪的選擇器語法混淆了呢? 嗯,那么,前端大大們的福音來了,PyQuery 來了,乍聽名字,你一定聯想到了 jQuery,如果你對 jQuery 熟悉,那么 PyQuery 來解析文檔就是不二之選!包括我在內! PyQuery 是 Python 仿照 jQuery 的嚴格實現。語法與 jQuery 幾乎完全相同,所以不用再去費心去記一些奇怪的方法了。 天下竟然有這等好事?我都等不及了!
安裝
pip install pyquery官方文檔
官方文檔
pyquery 可讓你用 jQuery 的語法來對 xml 進行操作。這 I 和 jQuery 十分類似。如果利用 lxml,pyquery 對 xml 和 html 的處理將更快。 這個庫不是(至少還不是)一個可以和 JavaScript 交互的代碼庫,它只是非常像 jQuery API 而已。
初始化
在這里介紹四種初始化方式。
- 直接字符串
pq 參數可以直接傳入 HTML 代碼,doc 現在就相當于 jQuery 里面的 $ 符號了。
- lxml.etree
可以首先用 lxml 的 etree 處理一下代碼,這樣如果你的 HTML 代碼出現一些不完整或者疏漏,都會自動轉化為完整清晰結構的 HTML 代碼。
- 直接傳 URL
這里就像直接請求了一個網頁一樣,類似用 urllib2 來直接請求這個鏈接,得到 HTML 代碼。
- 傳文件
可以直接傳某個路徑的文件名。
快速體驗
現在我們以本地文件為例,傳入一個名字為 hello.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(filename='hello.html') print doc.html() print type(doc) li = doc('li') print type(li) print li.text() <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><class 'pyquery.pyquery.PyQuery'> <class 'pyquery.pyquery.PyQuery'> first item second item third item fourth item fifth item看,回憶一下 jQuery 的語法,是不是運行結果都是一樣的呢? 在這里我們注意到了一點,PyQuery 初始化之后,返回類型是 PyQuery,利用了選擇器篩選一次之后,返回結果的類型依然還是 PyQuery,這簡直和 jQuery 如出一轍,不能更贊!然而想一下 BeautifulSoup 和 XPath 返回的是什么?列表!一種不能再進行二次篩選(在這里指依然利用 BeautifulSoup 或者 XPath 語法)的對象! 然而比比 PyQuery,哦我簡直太愛它了!
屬性操作
from pyquery import PyQuery as pqp = pq('<p id="hello" class="hello"></p>')('p') print p.attr("id") print p.attr("id", "plop") print p.attr("id", "hello") hello <p id="plop" class="hello"/> <p id="hello" class="hello"/> from pyquery import PyQuery as pqp = pq('<p id="hello" class="hello"></p>')('p') print p.addClass('beauty') print p.removeClass('hello') print p.css('font-size', '16px') print p.css({'background-color': 'yellow'}) <p id="hello" class="hello beauty"/> <p id="hello" class="beauty"/> <p id="hello" class="beauty" style="font-size: 16px"/> <p id="hello" class="beauty" style="font-size: 16px; background-color: yellow"/>p 是一直在原來的結果上變化的。 因此執行上述操作之后,p 本身也發生了變化。
DOM操作
from pyquery import PyQuery as pqp = pq('<p id="hello" class="hello"></p>')('p') print p.append(' check out <a href="http://reddit.com/r/python"><span>reddit</span></a>') print p.prepend('Oh yes!') d = pq('<div class="wrap"><div id="test"><a href="http://cuiqingcai.com">Germy</a></div></div>') p.prependTo(d('#test')) print p print d d.empty() print d <p id="hello" class="hello"> check out <a href="http://reddit.com/r/python"><span>reddit</span></a></p> <p id="hello" class="hello">Oh yes! check out <a href="http://reddit.com/r/python"><span>reddit</span></a></p> <p id="hello" class="hello">Oh yes! check out <a href="http://reddit.com/r/python"><span>reddit</span></a></p> <div class="wrap"><div id="test"><p id="hello" class="hello">Oh yes! check out <a href="http://reddit.com/r/python"><span>reddit</span></a></p><a href="http://cuiqingcai.com">Germy</a></div></div> <div class="wrap"/>DOM 操作也是與 jQuery 如出一轍。
遍歷
hello.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>遍歷用到 items 方法返回對象列表,或者用 lambda
from pyquery import PyQuery as pq doc = pq(filename='hello.html') lis = doc('li') for li in lis.items():print li.html()print lis.each(lambda e: e) first item <a href="link2.html">second item</a> <a href="link3.html"><span class="bold">third item</span></a> <a href="link4.html">fourth item</a> <a href="link5.html">fifth item</a> <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>不過最常用的還是 items 方法
網頁請求
PyQuery 本身還有網頁請求功能,而且會把請求下來的網頁代碼轉為 PyQuery 對象。
from pyquery import PyQuery as pq print pq('http://cuiqingcai.com/', headers={'user-agent': 'pyquery'}) print pq('http://httpbin.org/post', {'foo': 'bar'}, method='post', verify=True)感受一下,GET,POST,樣樣通。
Ajax
PyQuery 同樣支持 Ajax 操作,帶有 get 和 post 方法,不過不常用,一般我們不會用 PyQuery 來做網絡請求,僅僅是用來解析。 PyQueryAjax
API
API 原汁原味最全的 API,都在里面了!如果你對 jQuery 語法不熟,強烈建議先學習下 jQuery,再回來看 PyQuery,你會感到異常親切!
總結
以上是生活随笔為你收集整理的Python爬虫利器六PyQuery的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 错误/异常处理
- 下一篇: AB PLC学习笔记