爬蟲第六講:PyQuery

PyQuery

什么是PyQuery
PyQuery是強(qiáng)大又靈活的網(wǎng)頁解析庫。如果熟悉jQuery的語法尉桩,那么PyQuery就是你的絕佳選擇

安裝PyQuery

pip3 install PyQuery

用法講解

初始化

字符串初始化常用在得到網(wǎng)頁源代碼郊闯,然后進(jìn)行解析妻献。

html = """
<div>
    <ul>
        <li class="item-0">first item</li>
        <li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
</div>
"""
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('li'))#這里傳入CSS選擇器,標(biāo)簽選擇器团赁,結(jié)果返回所有l(wèi)i

URL初始化

from pyquery import PyQuery as pq
doc = pq(url='http://www.baidu.com')#使用url初始化
print(doc('head'))#返回html中的head

文件初始化

from qyquery import PyQuery as pq
doc = pq(filename='myhtml.html')
print(doc('li'))

基本的CSS選擇器

html = """
<div id="container">
    <ul>
        <li class="item-0">first item</li>
        <li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
</div>
"""
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('#container .active a'))#查找id=container 下的類名為active的 下的所有a標(biāo)簽育拨,只要有層級嵌套關(guān)系,不是直接父子關(guān)系欢摄。

查找元素
子元素熬丧,查找元素下的子元素


html = """
<div id="container">
    <ul class="list">
        <li class="item-0">first item</li>
        <li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
</div>
"""
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
print(type(items))
print(items)
lis = items.find('li')#想jQuery一樣,可以用find篩選所有子元素怀挠,無論層級
print(type(lis))
print(lis)

返回結(jié)果:返回值是<class 'pyquery.pyquery.PyQuery'>類型

<class 'pyquery.pyquery.PyQuery'>
<ul class="list">
        <li class="item-0">first item</li>
        <li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>

<class 'pyquery.pyquery.PyQuery'>
<li class="item-0">first item</li>
        <li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>

查找直接子元素

html = """
<div id="container">
    <ul class="list">
        <li class="item-0">first item</li>
        <li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
</div>
"""
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.item-0')#可能返回多個
print(items.children())#返回直接子元素

返回值:

<a href="lin3.html"><span class="bold">third item</span></a><a href="link5.html">fifth item</a>

這里返回了2條class="item-0"的li的直接子元素

父元素


html = """
<div id="container">
    <ul class="list">
        <li class="item-0">first item</li>
        <li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
</div>
"""
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
container = items.parent()
print(type(container))
print(container)#返回整個class=list的父節(jié)點(diǎn)--div的內(nèi)容

parents()--返回所有的祖先節(jié)點(diǎn)析蝴。

兄弟節(jié)點(diǎn)

html = """
<div id="container">
    <ul class="list">
        <li class="item-0">first item</li>
        <li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
</div>
"""
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.active')
print(items.siblings())#返回class=active的所有兄弟節(jié)點(diǎn)
print(items.siblings('.item-1'))#兄弟節(jié)點(diǎn)+CSS選擇器

*返回結(jié)果:

<li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0">first item</li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    
<li class="item-1"><a href="link.html">second item</a></li>

遍歷

  • 單個元素-返回的是單個元素那么就不談遍歷了,返回的是PyQuery對象
  • 多個元素绿淋,如果返回的是多個元素就用.items()闷畸,那么返回的實(shí)際上是一個生成器,可以用for循環(huán)遍歷
html = """
<div id="container">
    <ul class="list">
        <li class="item-0">first item</li>
        <li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
</div>
"""
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.active')
lis = items.siblings().items()
print(type(lis))
for item in lis:#遍歷所有兄弟節(jié)點(diǎn)
    print(item)

獲取信息

  • 獲取屬性
html = """
<div id="container">
    <ul class="list">
        <li class="item-0">first item</li>
        <li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
</div>
"""
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.attr('href'))#返回屬性為href的值
print(a.attr.href)#同上

返回結(jié)果:

<a href="lin3.html"><span class="bold">third item</span></a>
lin3.html
lin3.html
  • 獲取文本
html = """
<div id="container">
    <ul class="list">
        <li class="item-0">first item</li>
        <li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
</div>
"""
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.text())#返回a標(biāo)簽中的內(nèi)容

返回結(jié)果:

<a href="lin3.html"><span class="bold">third item</span></a>
third item
  • 獲取HTML
html = """
<div id="container">
    <ul class="list">
        <li class="item-0">first item</li>
        <li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
</div>
"""
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.html())#返回整個a標(biāo)簽的html代碼

返回結(jié)果:

<a href="lin3.html"><span class="bold">third item</span></a>
<span class="bold">third item</span>

DOM操作

  • addClass吞滞、removeClass
html = """
<div id="container">
    <ul class="list">
        <li class="item-0">first item</li>
        <li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
</div>
"""
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.removeClass('active')#刪除這個li的類名active
print(li)
li.addClass('active')#又加上active類名
print(li)

輸出結(jié)果

<li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        
<li class="item-0"><a href="lin3.html"><span class="bold">third item</span></a></li>
        
<li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
  • 添加或修改attr佑菩、css
html = """
<div id="container">
    <ul class="list">
        <li class="item-0">first item</li>
        <li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
</div>
"""
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.attr('name','mylink')#因?yàn)闆]有name屬性,所以實(shí)際上添加name屬性,值為mylink
print(li)
li.css('font-size','20px')#添加行內(nèi)style
print(li)
  • remove

html = """
<div class="wrap">
    hello,lll
    <p>This is test</p>
</div>
"""
from pyquery import PyQuery as pq
doc = pq(html)
wrap = doc('.wrap')
print(wrap.text())
wrap.find('p').remove()#刪除p標(biāo)簽
print(wrap.text())

偽類選擇器

html = """
<div id="container">
    <ul class="list">
        <li class="item-0">first item</li>
        <li class="item-1"><a href="link.html">second item</a></li>
        <li class="item-0 active"><a href="lin3.html"><span class="bold">third item</span></a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
</div>
"""
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('li:first-child')#html標(biāo)簽下第一個li
print(li)
li = doc('li:last-child')#html標(biāo)簽下最后一個li
print(li)
li = doc('li:nth-child(2)')#html標(biāo)簽下第二個li
print(li)
li = doc('li:gt(2)')#html標(biāo)簽下大于2的所有l(wèi)i
print(li)
li = doc('li:nth-child(2n)')#html標(biāo)簽下偶數(shù)的li
print(li)
li = doc('li:contains(second)')#html標(biāo)簽下li中的內(nèi)容包含second的li
print(li)

更多的CSS選擇器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倘待,一起剝皮案震驚了整個濱河市疮跑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凸舵,老刑警劉巖祖娘,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異啊奄,居然都是意外死亡渐苏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門菇夸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琼富,“玉大人,你說我怎么就攤上這事庄新【厦迹” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵择诈,是天一觀的道長械蹋。 經(jīng)常有香客問我,道長羞芍,這世上最難降的妖魔是什么哗戈? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮荷科,結(jié)果婚禮上唯咬,老公的妹妹穿的比我還像新娘。我一直安慰自己畏浆,他們只是感情好胆胰,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刻获,像睡著了一般蜀涨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上将鸵,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天勉盅,我揣著相機(jī)與錄音,去河邊找鬼顶掉。 笑死草娜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痒筒。 我是一名探鬼主播宰闰,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼茬贵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了移袍?” 一聲冷哼從身側(cè)響起解藻,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎葡盗,沒想到半個月后螟左,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡觅够,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年胶背,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喘先。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡钳吟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窘拯,到底是詐尸還是另有隱情其屏,我是刑警寧澤烹吵,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布拱烁,位于F島的核電站霜定,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏砂轻。R本人自食惡果不足惜奔誓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一斤吐、第九天 我趴在偏房一處隱蔽的房頂上張望搔涝。 院中可真熱鬧,春花似錦和措、人聲如沸庄呈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诬留。三九已至,卻和暖如春贫母,著一層夾襖步出監(jiān)牢的瞬間文兑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工腺劣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绿贞,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓橘原,卻偏偏與公主長得像籍铁,于是被迫代替她去往敵國和親涡上。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容