1.快速入门
简介
pyquery更适合用于CSS选择器。
实例
from pyquery import PyQuery as pq #引入PyQuery对象,取别名为pq 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-inactive'><a href='link3.html'><span class='bold'>thrid item</span></a></li> <li class='item-1'><a href='link4.html'>fourth item</a></li> <li class='item-0'><a href='link5.html'>fifth item</a> </ul> </div> ''' doc=pq(html) print(doc('li')) print(type(doc('li')))
输出:所有li节点
URL初始化
初始化的参数不仅可以以字符串的形式传递,还可以传入网页的url
from pyquery import PyQuery as pq doc=pq(url='https://ejgdlyz.github.io') ''' 类似于 from pyquery import PyQuery as pq import requests doc=pq(requests.get('https://ejgdlyz.github.io').text) print(doc('title')) ''' print(doc('title'))
文件初始化
from pyquery import PyQuery doc=pq(filename='demo.html') print('li')
2.基本CSS选择器
from pyquery import PyQuery
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-1 active'><a href='link3.html'><span class='bold'>thrid 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>
</ul>
</div>
'''
doc=PyQuery(html)
print(doc('#container .list li'))
print(type(doc('#container .list li')))
'''
输出
<li class="item-0">first item</li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html"><span class="bold">thrid item</span></a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</li>
<class 'pyquery.pyquery.PyQuery'>
'''
3.查找结点
子节点
查找子节点时,可以用find()方法。参数为css选择器。
from pyquery import PyQuery as pq #以前面的html为例 doc=pq(html) items=doc('.list') print(type(items)) print(items) lis=items.find('li')#选取其内部的所有li节点。find()方法会将所有符合条件的节点选择出来,结果类型为PyQuery类型 print(type(lis)) print(lis) #find()查找的范围时子孙节点,若只查找子节点,可以用children()方法 lis=items.children() #lis=items.children('.active') print(type(lis)) print(lis)
父节点
items=doc('.list')
container=items.parent()
print(type(container))
print(container)
'''
输出
<class 'pyquery.pyquery.PyQuery'>
<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">thrid 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>
'''
这里的父节点是该节点的直接父节点,它不会去查找父节点的父节点。
若想要获得祖先节点,可以使用parents()方法。parents()方法会返回所有祖先节点。
doc=pq(html)
items=doc('.list')
parents=items.parents()
print(type(parents))
print(parents)
parents()方法也可以传入css选择器
parent=items.parents('.list')
print(parent)
兄弟节点
siblings()方法获取兄弟节点。
doc=pq(html) li=doc('.list .item-0.active') print(li.siblings())
输出兄弟节点4个。
也可以向siblings()传入css选择器。
print(li.siblings('.active'))
4.遍历
pyquery的选择结果可能是多个节点,也可能是单个节点,类型都是PyQuery类型。
对于单个节点,可以打印输出,也可以转成字符串打印输出。
doc=pq(html)
li=doc('.item-0.active')
print(li)
print(str(li)[:10])
'''
输出
<li class="item-0 active"><a href="link3.html"><span class="bold">thrid item</span></a></li>
<li class=
'''
对于多个节点的结果,遍历获取。例如,遍历每一个li节点,需要items()方法。
lis=doc('li').items()#得到一个生成器,遍历,得到li对象,类型为PyQuery类型
print(type(lis))
for li in lis:
print(li,type(li))
'''
<class 'generator'>
<li class="item-0">first item</li>
<class 'pyquery.pyquery.PyQuery'>
<li class="item-1"><a href="link2.html">second item</a></li>
<class 'pyquery.pyquery.PyQuery'>
<li class="item-0 active"><a href="link3.html"><span class="bold">thrid item</span></a></li>
<class 'pyquery.pyquery.PyQuery'>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<class 'pyquery.pyquery.PyQuery'>
<li class="item-0"><a href="link5.html">fifth item</a>
</li> <class 'pyquery.pyquery.PyQuery'>
'''
5.获取信息
获取属性
提取到某个PyQuery类型的节点后,就可以调用attr()方法来获取属性。
from pyquery import PyQuery as pq html=''' <div class='mydiv'> <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'>thrid 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> </ul> </div> </div> ''' doc=pq(html) a=doc('.item-0.active a') print(a,type(a)) print(a.attr('href')) #print(a.attr.href)
当返回结果有多个时,就需要进行遍历。
a=doc('a').items() print(type(a)) for A in a: print(A.attr('href')) ''' 运行输出 <class 'generator'> link2.html link3.html link4.html link5.html '''
获取文本
调用text()方法来获取文本。
#同上 a=doc('.item-0.active a') print(a) print(a.text())#忽略节点内部的html文本,返回纯文字内容 ''' 运行输出 <a href="link3.html"><span class="bold">thrid item</span></a> thrid item '''
若想要获取节点内的html文本,可以用html()方法
li=doc('.item-0.active') print(li) print(li.html()) ''' 运行输出 <li class="item-0 active"><a href="link3.html"><span class="bold">thrid item</span></a></li> <a href="link3.html"><span class="bold">thrid item</span></a> '''
当返回结果是多个节点时,text()会将所有文本内容进行拼接,而html()只返回第一个节点的html文本内容。
doc=pq(html) lis=doc('li') print(lis.text()) print(lis.html()) ''' 运行输出 first item second item thrid item fourth item fifth item first item '''
6.节点操作
pyquery提供了一系列方法来对节点进行动态修改,为某个节点添加一个class,移除节点等。
addClass和removeClass
from pyquery import PyQuery as pq html=''' <div class='mydiv'> <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'>thrid 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> </ul> </div> </div> ''' doc=pq(html) li=doc('.item-0.active') print(li) li.removeClass('active')#移除active属性 print(li) li.add_class('active')#添加active属性 print(li) ''' 运行输出 <li class="item-0 active"><a href="link3.html"><span class="bold">thrid item</span></a></li> <li class="item-0"><a href="link3.html"><span class="bold">thrid item</span></a></li> <li class="item-0 active"><a href="link3.html"><span class="bold">thrid item</span></a></li> '''
attr,text,html
html=''' <ul class='list'> <li class='item-0 active'><a href='link3.html'><span class='bold'>thrid item</span></a></li> </ul> ''' doc=pq(html) li=doc('.item-0.active') print(li) li.attr('name','link') print(li) li.text('changed item') print(li) li.html('<span>changed item</span>') print(li) ''' 运行输出 <li class="item-0 active"><a href="link3.html"><span class="bold">thrid item</span></a></li> <li class="item-0 active" name="link"><a href="link3.html"><span class="bold">thrid item</span></a></li> <li class="item-0 active" name="link">changed item</li> <li class="item-0 active" name="link"><span>changed item</span></li> '''
attr()方法只传一个参数的属性名,就获取这个属性值,传入第二个参数,可以用来修改属性值。
text()和html()方法如果不传参数,则获取节点内纯文本和html文本,如果传入参数,则进行赋值。
remove()
html=''' <div class='div1'> Hello World! <p>This is a p Tag</p> </div> ''' from pyquery import PyQuery as pq doc=pq(html) div=doc('.div1') print(type(div)) print(div.text()) #如果只提取Hello world!这个字符串 print(div.find('p')) div.find('p').remove() print(div.text()) ''' <class 'pyquery.pyquery.PyQuery'> Hello World! This is a p Tag <p>This is a p Tag</p> Hello World! '''
7.伪类选择器
from pyquery import PyQuery as pq
html='''
<div class='mydiv'>
<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'>thrid 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>
'''
doc=pq(html)
li=doc('li:first-child')#输出第一个li节点
print(li)
li=doc('li:last-child')#最后一个li节点
print(li)
li=doc('li:nth-child(2)')#第二个li节点
print(li)
li=doc('li:gt(2)')#输出第三个之后的li节点
print(li)
li=doc('li:nth-child(2n)')#偶数位置的li节点
print(li)
li=doc('li:contains(second)')#包含second的li节点
print(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="link2.html">second item</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>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
'''