Pyquery对象中CSS用法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZHH_Love123/article/details/83387664

Pyquery对象中CSS选择器的用法

首先将HTML转为Pyquery对象在用css选择器

doc = pq(html)
print(doc('#con .list li'))选id是con 然后在选内部 class为list 节点内部所有li节点
item = doc('.list') 

子节点
find()方法  item.find(‘li’)符合条件的所有子孙节点  
children()方法  item.children(‘.active’)进一步筛选     如果只差子节点 用此方法  

父节点
parent()返回直接的父节点
parents()返回所有的祖先节点

如果找某个特定的祖先节点 向parents()传入CSS选择器 item.parents('.wap')

兄弟节点
li = doc('.list .item-0.active')
li.siblings()会选出所有的兄弟节点 包括上兄弟和下兄弟 需要选特定某个兄弟 需要传入CSS选择器 li.siblings('.active')

遍历  
多个节点需要遍历出来
li = doc('li') 选到所有的li标签 需要调items()方法返回的是generator类型
generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次


获取信息
获取属性
a = doc('a')
一、attr()方法获取属性 a.attr('href')   如果选的多个  attr()只返回第一个 也就是只有第一个能被调用 要获取全部需要遍历
二、a.attr.href 返回全部

获取文本
获取a节点文本 a.text() 返回的是字符串
若要获取整个HTML文本 用html()方法
如果匹配到的是多个节点 text()获取全部  html()只能获取第一个 除非遍历

伪类选择器
li = doc('li:first-child') 第一个li节点
li = doc('li:last-child')  最后一个li节点
li = doc('li:nth-child(2)')第二个li节点
li = doc('li:gt(2)')  第三个li节点之后的li节点
li = doc('li:nth-child(2n)') 偶数位置的li节点
li = doc('li:cobtains(content)') 包含content文本的节点

li </span><span class="pun">=</span><span class="pln"> doc</span><span class="pun">(</span><span class="str">‘li:contains(second)‘</span><span class="pun">)</span>

节点操作

addClassremoveClass

我们先用实例来感受一下:

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)

首先选中了第三个li节点,然后调用removeClass()方法,将li节点的active这个class移除,后来又调用addClass()方法,将class添加回来。每执行一次操作,就打印输出当前li节点的内容。

可以看到,一共输出了3次。第二次输出时,li节点的active这个class被移除了,第三次class又添加回来了。

所以说,addClass()和removeClass()这些方法可以动态改变节点的class属性。

attrtexthtml

当然,除了操作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)

li.attr(‘name‘, ‘link‘)

print(li)

li.text(‘changed item‘)

print(li)

li.html(‘<span>changed item</span>‘)

print(li)

这里我们首先选中li节点,然后调用attr()方法来修改属性,其中该方法的第一个参数为属性名,第二个参数为属性值。接着,调用text()和html()方法来改变节点内部的内容。三次操作后,分别打印输出当前的li节点。

可以发现,调用attr()方法后,li节点多了一个原本不存在的属性name,其值为link。接着调用text()方法,传入文本之后,li节点内部的文本全被改为传入的字符串文本了。最后,调用html()方法传入HTML文本后,li节点内部又变为传入的HTML文本了。

所以说,如果attr()方法只传入第一个参数的属性名,则是获取这个属性值;如果传入第二个参数,可以用来修改属性值。text()和html()方法如果不传参数,则是获取节点内纯文本和HTML文本;如果传入参数,则进行赋值。

 

 

remove()

顾名思义,remove()方法就是移除,它有时会为信息的提取带来非常大的便利。下面有一段HTML文本:

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节点内部的字符串,需要怎样操作呢?

这里直接先尝试提取class为wrap的节点的内容,看看是不是我们想要的。运行结果如下:

这个结果还包含了内部的p节点的内容,也就是说text()把所有的纯文本全提取出来了。如果我们想去掉p节点内部的文本,可以选择再把p节点内的文本提取一遍,然后从整个结果中移除这个子串,但这个做法明显比较烦琐。

这时remove()方法就可以派上用场了,我们可以接着这么做:

wrap.find(‘p‘).remove()

print(wrap.text())

猜你喜欢

转载自blog.csdn.net/ZHH_Love123/article/details/83387664
今日推荐