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>
节点操作
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)
首先选中了第三个li节点,然后调用removeClass()方法,将li节点的active这个class移除,后来又调用addClass()方法,将class添加回来。每执行一次操作,就打印输出当前li节点的内容。
可以看到,一共输出了3次。第二次输出时,li节点的active这个class被移除了,第三次class又添加回来了。
所以说,addClass()和removeClass()这些方法可以动态改变节点的class属性。
attr、text和html
当然,除了操作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())