歡迎關(guān)注哈希大數(shù)據(jù)公眾號【哈希大數(shù)據(jù)】
前面的分享如何獲取免費(fèi)高匿代理IP代碼中我們用到了pyquery這個(gè)解析庫,這個(gè)庫在之前的分享中還不曾講到,前面我們主要用的是beautiful soup解析庫聘惦,如果你比較喜歡用CSS選擇器硼被,如果你對jQuery有所了解志衍,可以選擇使用pyquery,它的語法相對更為簡單问芬。下面我們看看該如何使用它吧!
本次分享將從以下四個(gè)方面介紹pyquery庫:
如何安裝pyquery
如何初始化
如何查找節(jié)點(diǎn)寿桨、獲取信息
如何安裝pyquery
Windows系統(tǒng) 利用win + R快捷鍵打開運(yùn)行窗口此衅,輸入cmd點(diǎn)擊確定,打開命令行,然后直接輸入:pip install pyquery炕柔,等待完成安裝后在命令行中輸入python酌泰,然后輸入import pyquery檢查是否安裝成功,如下圖輸入import pyquery后沒有出現(xiàn)問題就說明安裝成功匕累。
如何初始化
pyquery提供了多種初始化方法例如:直接傳入字符串陵刹,傳入U(xiǎn)RL,傳入文件名欢嘿,傳入lxml等衰琐。對于爬蟲來說我們很少的時(shí)候使用傳入U(xiǎn)RL的方式,更多的是使用傳入由requests或其他HTTP庫請求URL得到的response炼蹦。例如:
from pyquery import PyQuery as pq# 出入U(xiǎn)RLdoc = pq(url='https://www.baidu.com/')# 傳入字符串的形式import requestsr = requests.get('https://www.baidu.com/')html = r.textdoc = pq(html)
因?yàn)檎埱髐rl涉及到user-agent羡宙,cookies,檢查是否成功返回等各種問題掐隐,所以還是交給專業(yè)的HTTP庫去做比較好狗热。
如何查找節(jié)點(diǎn)、獲取信息
1.基本CSS選擇器
我們可以利用class虑省、id匿刮、標(biāo)簽名稱或者是一個(gè)序列的方式定位到某個(gè)標(biāo)簽。
例如:
from pyquery import PyQuery as pq# 傳入字符串的形式html_doc = """<html><head><title>The Dormouse's story</title></head><p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were<a class="sister" id="link1">Elsie</a>,<a class="sister" id="link2">Lacie</a> and<a class="sister" id="link3">Tillie</a>;and they lived at the bottom of a well.</p><p class="story">...</p>"""doc = pq(html_doc)title = doc('.title')#選擇class為title的所有標(biāo)簽探颈,及其子孫標(biāo)簽print(title)link1 = doc('html .story #link1')#選擇所有html標(biāo)簽下的所有class為story的標(biāo)簽下的所有id為link1的標(biāo)簽熟丸。print(link1)
查找子節(jié)點(diǎn)
查找子節(jié)點(diǎn)需要用到find()方法,傳入的參數(shù)是CSS選擇器伪节,我們還是以上面的HTML為例光羞。
doc = pq(html_doc)title = doc('.title')#選擇class為title的所有標(biāo)簽,及其子孫標(biāo)簽print(title)title_b = title.find('b')#找到b子標(biāo)簽
遍歷
PyQuery的選擇結(jié)果可能是多個(gè)節(jié)點(diǎn)怀大,可能是單個(gè)節(jié)點(diǎn)纱兑,類型都是PyQuery類型,并沒有返回像BeautifulSoup一樣的列表化借。對于多個(gè)節(jié)點(diǎn)的結(jié)果萍启,我們需要調(diào)用items()方法獲取一個(gè)列表。
doc = pq(html_doc)names = doc('.story a').items()for name in names: print(name)
獲取屬性屏鳍、文本勘纯、HTML等信息
提取到某個(gè)PyQuery類型的節(jié)點(diǎn)之后,我們可以調(diào)用attr()方法來獲取屬性钓瞭。
doc = pq(html_doc)name = doc('.story #link1')print(name.attr('href'))
我們可以調(diào)用text()方法來獲取標(biāo)簽內(nèi)的所有文本驳遵,例如:
doc = pq(html_doc)text = doc('.story')print(text.text())
這里我們將p標(biāo)簽的子標(biāo)簽a中的文本也獲取出來了,有時(shí)候需要這樣山涡,但有時(shí)候我們只想獲取其自身的text堤结,不想得到其子標(biāo)簽的text這時(shí)候我們需要remove函數(shù)的幫助唆迁。
doc = pq(html_doc)text = doc('.story')text.find('a').remove()print(text.text())
這時(shí)候就將a標(biāo)簽剔除掉了,只留下p標(biāo)簽的內(nèi)容竞穷。
pyquery利用class唐责、id、標(biāo)簽名稱返回符合條件的所有元素瘾带,但有時(shí)候我們只需要第一個(gè)或最后一個(gè)或其中幾個(gè)鼠哥。這時(shí)候我們利用偽類選擇器就十分方便了。
2.偽類選擇器
| p:first-child | 選擇屬于父元素的第一個(gè)子元素的每個(gè) <p> 元素看政。 |
| p:last-child | 選擇屬于其父元素最后一個(gè)子元素每個(gè) <p> 元素朴恳。 |
| a[src^="htpps"] | 選擇其 src 屬性值以 "https" 開頭的每個(gè) <a> 元素。 |
| a[src*="htpps"] | 選擇其 src 屬性中包含 "abc" 子串的每個(gè) <a> 元素允蚣。 |
更多偽選擇器的用法可以參考:http://www.w3school.com.cn/cssref/css_selectors.asp小結(jié)
本次分享主要介紹了pyquery的安裝于颖、初始化以及查找節(jié)點(diǎn)獲取信息的方法,pyquery相對于beautiful soup庫語法更為簡單嚷兔,而且對于熟悉jQuery的朋友來說是零門檻森渐。但pyquery有時(shí)候會(huì)出現(xiàn)解析不出內(nèi)容的情況,這也是之前沒給大家介紹的原因冒晰,不過這種情況畢竟很少同衣,為了快速搞定爬取任務(wù),很多時(shí)候pyquery是不錯(cuò)的選擇翩剪。