爬蟲(五):PyQuery的使用

一:簡介css

PyQuery庫是jQuery的Python實現,能夠用於解析HTML網頁內容,是一個很是強大又靈活的網頁解析庫。html

--》官方文檔地址python

--》jQuery參考文檔jquery

二:初始化api

初始化的時候通常有三種傳入方式:傳入字符串,傳入url,傳入文件。ui

(1):字符串初始化url

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(html)
print(doc('li'))

################# 運行結果
        <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>
##################    

注意:spa

因爲PyQuery寫起來比較麻煩,因此咱們導入的時候都會添加別名:
from pyquery import PyQuery as pqcode

這裏咱們能夠知道上述代碼中的doc其實就是一個pyquery對象,咱們能夠經過doc能夠進行元素的選擇,其實這裏就是一個css選擇器,因此CSS選擇器的規則均可以用,直接doc(標籤名)就能夠獲取全部的該標籤的內容,若是想要獲取class 則doc('.class_name'),若是是id則doc('#id_name')....htm

(2):url初始化

from pyquery import PyQuery as pq
doc = pq(url='http://www.baidu.com')
print(doc('head'))

(3):文件初始化

from pyquery import PyQuery as pq
doc = pq(filename='demo.html')
print(doc('li'))

注意:pq()這裏能夠傳入url參數也能夠傳入文件參數,固然這裏的文件一般是一個html文件,例如:pq(filename='index.html')

三:基本的CSS選擇器

html = '''
<div id="container">
    <ul class="list">
         <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(html)
print(doc('#container .list li'))

注意:

doc('#container .list li'),這裏的三者之間的並非必需要挨着,只要是層級關係就能夠,下面是經常使用的CSS選擇器方法:

(1):查找元素

子元素:

html = '''
<div id="container">
    <ul class="list">
         <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(html)
items = doc('.list')
print(type(items))
print(items)
lis = items.find('li')
print(type(lis))
print(lis)

#####################運行結果
<class 'pyquery.pyquery.PyQuery'>
<ul class="list">
         <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'>
<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>
##############################

從結果裏咱們也能夠看出經過pyquery找到結果其實仍是一個pyquery對象,能夠繼續查找,上述中的代碼中的items.find('li') 則表示查找ul裏的全部的li標籤
固然這裏經過children能夠實現一樣的效果,而且經過.children方法獲得的結果也是一個pyquery對象

li = items.children()
print(type(li))
print(li)

# 在children裏也能夠用CSS選擇器
li2 = items.children('.active')
print(li2)

 父元素:

經過.parent就能夠找到父元素的內容:

html = '''
<div id="container">
    <ul class="list">
         <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(html)
items = doc('.list')
container = items.parent()
print(type(container))
print(container)

經過.parents就能夠找到祖先節點的內容:

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <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>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
parents = items.parents()
print(type(parents))
print(parents)

# 經過.parents查找的時候也能夠添加css選擇器來進行內容的篩選

兄弟元素:

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <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>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.list .item-0.active')
print(li.siblings())

代碼中doc('.list .item-0.active') 中的.tem-0和.active是緊挨着的,因此表示是並的關係,這樣知足條件的就剩下一個了:thired item的那個標籤了
這樣在經過.siblings就能夠獲取全部的兄弟標籤,固然這裏是不包括本身的
一樣的在.siblings()裏也是能夠經過CSS選擇器進行篩選

(2):遍歷

單個元素:

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <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>
</div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)

lis = doc('li').items()  # 經過items()能夠獲得一個生成器,而且經過循環獲得每一個元素
print(type(lis))
for li in lis:
    print(type(li))
    print(li)

三:獲取信息

獲取屬性:

pyquery對象.attr(屬性名)
pyquery對象.attr.屬性名

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <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>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.attr('href'))
print(a.attr.href)

# 得到屬性值的時候能夠直接a.attr(屬性名)或者a.attr.屬性名

獲取文本:

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <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>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.text())

# 經過.text()就能夠獲取文本信息

獲取html:

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <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>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
print(li.html())

# 經過.html()的方式能夠獲取當前標籤所包含的html信息

四:DOM操做

addClass、removeClass
經過這兩個操做能夠添加和刪除屬性

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <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>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.removeClass('active')
print(li)
li.addClass('active')
print(li)

attr,css
一樣的咱們能夠經過attr給標籤添加和修改屬性,
若是以前沒有該屬性則是添加,若是有則是修改
咱們也能夠經過css添加一些css屬性,這個時候,標籤的屬性裏會多一個style屬性

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <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>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.attr('name', 'link')
print(li)
li.css('font-size', '14px')
print(li)

remove
有時候咱們獲取文本信息的時候可能並列的會有一些其餘標籤干擾,這個時候經過remove就能夠將無用的或者干擾的標籤直接刪除,從而方便操做

html = '''
<div class="wrap">
    Hello, World
    <p>This is a paragraph.</p>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
wrap = doc('.wrap')
print(wrap.text())
wrap.find('p').remove()
print(wrap.text())

五:官方api整理-->api

使用方法
from pyquery import PyQuery as pq

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>]

相關文章
相關標籤/搜索