Python爬蟲工程師從入門到進階

語言: CN / TW / HK

屬性操作

你可以完全按照 jQuery 的語法來進行 PyQuery 的操作。 《Python爬蟲工程師從入門到進階

1
2
3
4
5
6
from pyquery import PyQuery as pq

p = pq('<p id="hello" class="hello"></p>')('p')
print p.attr("id")
print p.attr("id", "plop")
print p.attr("id", "hello")
 

執行結果

1
2
3
hello
<p id="plop" class="hello"/>
<p id="hello" class="hello"/>
 

再來一發

1
2
3
4
5
6
7
from pyquery import PyQuery as pq

p = 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'})
 

執行結果

1
2
3
4
<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 操作

同樣的原汁原味的 jQuery 語法

1
2
3
4
5
6
7
8
9
10
11
from pyquery import PyQuery as pq

p = 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
 

執行結果

1
2
3
4
5
<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 如出一轍。

遍歷

遍歷用到 items 方法返回物件列表,或者用 lambda

1
2
3
4
5
6
7
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)
 

執行結果

1
2
3
4
5
6
7
8
9
10
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 方法