python之爬虫(九)PyQuery库的使用

PyQuery库也是一个很是强大又灵活的网页解析库,若是你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你很是绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严格实现。语法与 jQuery 几乎彻底相同,因此不用再去费心去记一些奇怪的方法了。css

官网地址:http://pyquery.readthedocs.io/en/latest/
jQuery参考文档: http://jquery.cuishifeng.cn/
html

初始化

初始化的时候通常有三种传入方式:传入字符串,传入url,传入文件前端

字符串初始化jquery

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

结果以下:api

因为PyQuery写起来比较麻烦,因此咱们导入的时候都会添加别名:
from pyquery import PyQuery as pqui

这里咱们能够知道上述代码中的doc其实就是一个pyquery对象,咱们能够经过doc能够进行元素的选择,其实这里就是一个css选择器,因此CSS选择器的规则均可以用,直接doc(标签名)就能够获取全部的该标签的内容,若是想要获取class 则doc('.class_name'),若是是id则doc('#id_name')....url

URL初始化spa

from pyquery import PyQuery as pq

doc = pq(url="http://www.baidu.com",encoding='utf-8')
print(doc('head'))

文件初始化code

咱们在pq()这里能够传入url参数也能够传入文件参数,固然这里的文件一般是一个html文件,例如:pq(filename='index.html')htm

基本的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选择器方法:

查找元素

子元素
children,find
代码例子:

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)

运行结果以下

从结果里咱们也能够看出经过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,parents方法

经过.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选择器来进行内容的筛选

兄弟元素
siblings

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选择器进行筛选

遍历

单个元素

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()
print(type(lis))
for li in lis:
    print(type(li))
    print(li)

运行结果以下:从结果中咱们能够看出经过items()能够获得一个生成器,而且咱们经过for循环获得的每一个元素依然是一个pyquery对象。

获取信息

获取属性
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标签包含的文本信息,经过.text()就能够获取文本信息

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())

结果以下:

获取html
咱们经过.html()的方式能够获取当前标签所包含的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())

结果以下:

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())

结果以下:

pyquery中DOM的其余api操做参考:
http://pyquery.readthedocs.io/en/latest/api.html

相关文章
相关标签/搜索