一、初始化
- 字符串初始化
#像Beautiful Soup 一样,初始化pyquery 的时候,也需要传入HTML 文本来初始化一个PyQue1y对象。
#字符串初始化
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节点,选择所有li节点
- URL初始化
#URL初始化
#初始化的参数不仅可以以字符串的形式传递,还可以传入网页的URL
doc = pq(url='https://cuiqingcai.com')
#doc = pq(requests.get('https://cuiqingcai.com').text)
print(doc('title'))
- 文件初始化
#文件初始化
doc = pq(filename='demo.html')
print(doc('li'))
二、CSS选择器
#基本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'))
#先选取id为container的节点,然后再选区其内部的class为list的节点内部的所有li节点
print(type(doc('#container .list li')))
三、查找节点
这些函数和jQuery 中函数的用法完全相同。
- 子节点
#查找节点
#子节点,需要用到find()方法,此时传人的参数是css选择器
from pyquery import PyQuery as pq
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>
'''
doc = pq(html)
items = doc('.list')
print(type(items))
print(items)
lis = items.find('li')
print(type(lis))
print(lis)
#其实find()的查找范围是节点的所有子孙节点,如果我们只想查找子节点,那么可以用children()方法
lis = items.children('.active')
print(type(lis))
print(lis)
- 父节点
#查找节点
#父节点
from pyquery import PyQuery as pq
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>
'''
doc =pq(html)
items = doc('.list')
container = items.parent()
print(type(container))
print(container)
#parent()是直接父节点,parents()是祖先节点
print('----------------------------')
parents = items.parents()
print(type(parents))
print(parents)
#输出结果有两个:一个是class为wrap的节点,一个是id为container的节点
#如果想要筛选某个祖先节点的话,可以传入CSS选择器
print('------------------------------')
parent = items.parents('.wrap')
print(parent)
- 兄弟节点
#兄弟节点
from pyquery import PyQuery as pq
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>
'''
doc = pq(html)
#选择class为list的节点内部class为item-0和active的节点
li = doc('.list .item-0.active')
print(li.siblings())
print('--------------')
print(li.siblings('.active'))
- 遍历
#遍历
from pyquery import PyQuery as pq
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>
'''
doc = pq(html)
lis = doc('li').items() #调用items()方法后,会得到一个生成器
print(type(lis))
for li in lis:
print(li,type(li))
- 获取信息
#获取信息 获取属性
#提取到某个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)
#选中class为item-0和active的li节点内的a节点
a = doc('.item-0.active a')
print(a,type(a))
print(a.attr('href')) #print(a.attr.href)
a = doc('a') #
print(a,type(a))
print(a.attr('href'))
# 这是因为,当返回结果包含多个节点时,调用attr ()方法,只会得
# 到第一个节点的属性。
print(a.attr.href)
for item in a.items():
print(item.attr('href'))
#获取信息 获取文本
#获取节点之后的另一个主要操作就是获取其内部的文本了,此时可以调用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()方法了:
print('------------------------')
li = doc('.item-0.active')
print(li)
print(li.html())
#?如果text()或HTML()会返回什么内容
print('---------------------------')
lis = doc('li')
print(lis.html())
print(lis.text())
print(type(lis.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)
#addClass()和removeClass()这些方法可以动态改变节点的class属性。
li = doc('.item-0.active')
print(li)
li.removeClass('active')
print(li)
li.addClass('active')
print(li)
#除了操作class这个属性外,也可以用attr()方法对属性进行操作。此外,还可以用text()
#和html()方法来改变节点内部的内容。
html='''
<ul class = "list">
<li class = "item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
</ul>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
#调用attr()方法后,li节点多了一个原本不存在的属性name,其值为link
li.attr('name','link')
print(li)
#调用text()方法,传入文本之后,li节点内部的文本全被改为传入的字符串文本了。
li.text('changed item')
print(li)
#调用html()方法传人HTML 文本后li 节点内部又变为传人的HTML 文本了
li.html('<span>changed item</span>')
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())
#现在想提取Hello, World 这个字符串,而不要p节点内部的字符串
wrap.find('p').remove()
print(wrap.text())
- 伪类选择器
#伪类选择器
#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)
print('---------------')
li = doc('li:first-child') #第一个li节点
print(li)
print('---------------')
li = doc('li:last-child') #最后一个li节点
print(li)
print('---------------')
li = doc('li:nth-child(2)') #第二个li节点
print(li)
print('---------------')
li = doc('li:gt(2)') #第三个li之后的li 节点
print(li)
print('---------------')
li = doc('li:nth-child(2n)') #偶数位置的li节点
print(li)
print('---------------')
li = doc('li:contains(second)')#包含second 文本的li 节点
print(li)