python中pyquery的使用(获取信息、节点操作、伪类选择器)

5.获取信息

  • 获取属性

提取到某个PyQuery类型的节点后,可以调用attr()方法来获取属性。

from pyquery import PyQuery
html = '''
<div class="warp">
<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">three 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>
'''
pq = PyQuery(html)
a = pq('.item-0.active a')
sx = a.attr('href')
print(sx)

首先选取class为item-0和active的节点,再选择其中的a节点。然后调用attr()方法,在方法中传入属性的名称。
在这里插入图片描述
如想要获取多个元素就得使用遍历,比如要获取所有li节点的属性:

pq = PyQuery(html)
cla = pq('li')
sx = cla.attr('class')
print(sx)

如果只是这样,那么返回的仅仅只是第一个li节点的属性。

pq = PyQuery(html)
cla = pq('li')
for li in cla.items():
    print(li.attr('class'))

此时,获取的便是所有li节点的属性了。
在这里插入图片描述

  • 获取文本

在获取某个节点后,可以调用text()方法来获取文本。

from pyquery import PyQuery
html = '''
<div class="warp">
<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">three 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>
'''
pq = PyQuery(html)
cla = pq('li')
print(cla.text())

在这里插入图片描述
若是想获取HTML文本,那么调用html()方法即可。html()方法返回的是第一个节点内部的HTML文本,而text()方法返回的是所有节点的文本,中间使用空格间隔,是一个字符串。
如果得到的结果是多个节点,又想要获取每个节点的HTML文本,那么可以使用items()进行遍历。

6.节点操作

pyquery提供了一系列方法来对节点进行动态修改,比如为某个节点添加一个class,移除某个节点等。

  • addClass() 和 removeClass()
from pyquery import PyQuery
html = '''
<div class="warp">
<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">three 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>
'''
pq = PyQuery(html)
li = pq('.item-0.active')
print(li)
# 删除li节点中的active这个class
li.removeClass('active')
print(li)
# 添加li节点中的active这个class
li.addClass('active')
print(li)

在这里插入图片描述

  • attr()、text()和html()
from pyquery import PyQuery
html = '''
<div class="warp">
<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">three 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>
'''
pq = PyQuery(html)
li = pq('.item-0.active')
print(li)
li.attr('name', 'link')
print(li)
li.text('changed text')
print(li)
li.html('<span>changed text</span>')
print(li)

由上可知,attr()方法只传入第一个参数的属性名,则是获取这个属性值,如果传入第二个参数可以修改属性值。text()和html()如果不传参数,就是获取文本和HTML文本,如果传入参数,则是进行修改。
在这里插入图片描述

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

在只想提取Hello,World这个字符串时,可先选择p节点,然后使用remove()去掉p节点,然后再调用text()就可以提取出想要的内容。

7.伪类选择器

CSS选择器支持多种多样的伪类选择器,例如选择第一个节点、最后一个节点、奇偶数节点、包含某一文本的节点等。

html = '''
<div class="warp">
<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">three 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
doc = PyQuery(html)
# 选择第一个li节点
li = doc('li:first-child')
# 选择最后一个li节点
li = doc('li:last-child')
# 选择第二个li节点
li = doc('li:nth-child(2)')
# 选择第三个li之后的li节点
li = doc('li:gt(2)')
# 选择偶数位置的li节点
li = doc('li:nth-child(2n)')
# 选择包含second文本的li节点
li = doc('li:contains(second)')

猜你喜欢

转载自blog.csdn.net/weixin_43670190/article/details/106493948