介紹
pyquery庫是jQuery的Python實現,可以用於解析HTML網頁內容,官方文檔地址是:http://packages.python.org/pyquery/
pyquery 可讓你用 jQuery 的語法來對 xml 進行操作。這I和 jQuery 十分類似。如果利用 lxml,pyquery 對 xml 和 html 的處理將更快。
這個庫不是(至少還不是)一個可以和 JavaScript交互的代碼庫,它只是非常像 jQuery API 而已。
安裝
pip install pyquery
或下載安裝:https://pypi.python.org/pypi/pyquery/#downloads
初始化
引入庫:from pyquery import PyQuery as pq
1、直接字符串
doc = pq("<html></html>") pq 參數可以直接傳入 HTML 代碼,doc 現在就相當於 jQuery 里面的 $ 符號了
2、lxml.etree
doc = pq(etree.fromstring("<html></html>"))
可以首先用 lxml 的 etree 處理一下代碼,這樣如果你的 HTML 代碼出現一些不完整或者疏漏,都會自動轉化為完整清晰結構的 HTML代碼。
3、直接傳URL
doc = pq('http://www.baidu.com')
這里就像直接請求了一個網頁一樣,類似用 urllib2 來直接請求這個鏈接,得到 HTML 代碼
4、傳文件
doc = pq(filename='hello.html')
可以直接傳某個路徑的文件名。
快速體驗
現在我們以本地文件為例,傳入一個名字為 hello.html 的文件,文件內容為:
運行結果:
在這里我們注意到了一點,PyQuery 初始化之后,返回類型是 PyQuery,利用了選擇器篩選一次之后,返回結果的類型依然還是 PyQuery,這簡直和 jQuery 如出一轍,不能更贊!
然而想一下 BeautifulSoup 和 XPath 返回的是什么?列表!一種不能再進行二次篩選(在這里指依然利用 BeautifulSoup 或者 XPath 語法)的對象!
屬性操作
你可以完全按照 jQuery 的語法來進行 PyQuery 的操作
運行結果
DOM操作
遍歷
網頁請求
pyquery – PyQuery complete API
https://pythonhosted.org/pyquery/api.html
1.可加載一段HTML字符串,或一個HTML文件,或是一個url地址,
d=pq("<html><title>hello</title></html>")
d=pq(filename=path_to_html_file)
d=pq(url='http://www.baidu.com')注意:此處url似乎必須寫全
2.html()和text() ——獲取相應的HTML塊或文本塊,
p=pq("<head><title>hello</title></head>")
p('head').html()#返回<title>hello</title>
p('head').text()#返回hello
3.根據HTML標簽來獲取元素,
d=pq('<div><p>test 1</p><p>test 2</p></div>')
d('p')#返回[<p>,<p>]
print d('p')#返回<p>test 1</p><p>test 2</p>
print d('p').html()#返回test 1
注意:當獲取到的元素不只一個時,html()、text()方法只返回首個元素的相應內容塊
4.eq(index) ——根據給定的索引號得到指定元素
接上例,若想得到第二個p標簽內的內容,則可以:
print d('p').eq(1).html() #返回test 2
5.filter() ——根據類名、id名得到指定元素,例:
d=pq("<div><p id='1'>test 1</p><p class='2'>test 2</p></div>")
d('p').filter('#1') #返回[<p#1>]
d('p').filter('.2') #返回[<p.2>]
6.find() ——查找嵌套元素
d=pq("<div><p id='1'>test 1</p><p class='2'>test 2</p></div>")
d('div').find('p')#返回[<p#1>, <p.2>]
d('div').find('p').eq(0)#返回[<p#1>]
7.直接根據類名、id名獲取元素
d=pq("<div><p id='1'>test 1</p><p class='2'>test 2</p></div>")
d('#1').html()#返回test 1
d('.2').html()#返回test 2
8.獲取屬性值
d=pq("<p id='my_id'><a href='http://hello.com'>hello</a></p>")
d('a').attr('href')#返回http://hello.com
d('p').attr('id')#返回my_id
9.修改屬性值
d('a').attr('href', 'http://baidu.com')把href屬性修改為了baidu
10.addClass(value) ——為元素添加類
d=pq('<div></div>')
d.addClass('my_class')#返回[<div.my_class>]
11.hasClass(name) #返回判斷元素是否包含給定的類
d=pq("<div class='my_class'></div>")
d.hasClass('my_class')#返回True
12.children(selector=None) ——獲取子元素
d=pq("<span><p id='1'>hello</p><p id='2'>world</p></span>")
d.children()#返回[<p#1>, <p#2>]
d.children('#2')#返回[<p#2>]
13.parents(selector=None)——獲取父元素
d=pq("<span><p id='1'>hello</p><p id='2'>world</p></span>")
d('p').parents()#返回[<span>]
d('#1').parents('span')#返回[<span>]
d('#1').parents('p')#返回[]
14.clone() ——返回一個節點的拷貝
15.empty() ——移除節點內容
16.nextAll(selector=None) ——返回后面全部的元素塊
d=pq("<p id='1'>hello</p><p id='2'>world</p><img scr='' />")
d('p:first').nextAll()#返回[<p#2>, <img>]
d('p:last').nextAll()#返回[<img>]
17.not_(selector) ——返回不匹配選擇器的元素
d=pq("<p id='1'>test 1</p><p id='2'>test 2</p>")
d('p').not_('#2')#返回[<p#1>]
jQuery的文檔
可以參考query的文檔來明白pyquery的使用方式
jQuery 遍歷函數
jQuery 遍歷函數包括了用於篩選、查找和串聯元素的方法。
函數 描述
.add() 將元素添加到匹配元素的集合中。
.andSelf() 把堆棧中之前的元素集添加到當前集合中。
.children() 獲得匹配元素集合中每個元素的所有子元素。
.closest() 從元素本身開始,逐級向上級元素匹配,並返回最先匹配的祖先元素。
.contents() 獲得匹配元素集合中每個元素的子元素,包括文本和注釋節點。
.each() 對 jQuery 對象進行迭代,為每個匹配元素執行函數。
.end() 結束當前鏈中最近的一次篩選操作,並將匹配元素集合返回到前一次的狀態。
.eq() 將匹配元素集合縮減為位於指定索引的新元素。
.filter() 將匹配元素集合縮減為匹配選擇器或匹配函數返回值的新元素。
.find() 獲得當前匹配元素集合中每個元素的后代,由選擇器進行篩選。
.first() 將匹配元素集合縮減為集合中的第一個元素。
.has() 將匹配元素集合縮減為包含特定元素的后代的集合。
.is() 根據選擇器檢查當前匹配元素集合,如果存在至少一個匹配元素,則返回 true。
.last() 將匹配元素集合縮減為集合中的最后一個元素。
.map() 把當前匹配集合中的每個元素傳遞給函數,產生包含返回值的新 jQuery 對象。
.next() 獲得匹配元素集合中每個元素緊鄰的同輩元素。
.nextAll() 獲得匹配元素集合中每個元素之后的所有同輩元素,由選擇器進行篩選(可選)。
.nextUntil() 獲得每個元素之后所有的同輩元素,直到遇到匹配選擇器的元素為止。
.not() 從匹配元素集合中刪除元素。
.offsetParent() 獲得用於定位的第一個父元素。
.parent() 獲得當前匹配元素集合中每個元素的父元素,由選擇器篩選(可選)。
.parents() 獲得當前匹配元素集合中每個元素的祖先元素,由選擇器篩選(可選)。
.parentsUntil() 獲得當前匹配元素集合中每個元素的祖先元素,直到遇到匹配選擇器的元素為止。
.prev() 獲得匹配元素集合中每個元素緊鄰的前一個同輩元素,由選擇器篩選(可選)。
.prevAll() 獲得匹配元素集合中每個元素之前的所有同輩元素,由選擇器進行篩選(可選)。
.prevUntil() 獲得每個元素之前所有的同輩元素,直到遇到匹配選擇器的元素為止。
.siblings() 獲得匹配元素集合中所有元素的同輩元素,由選擇器篩選(可選)。
.slice() 將匹配元素集合縮減為指定范圍的子集。