PyQuery选择器
学了re,xpath,beautifuisoup,再接着学PyQuery时总觉得,一些语句自己已经看过很多遍了,我们从一个简单的例子入手。
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'))
有用的信息就是,
from pyquery import PyQuery as pq #必加 pq(filename='demo.html') 本地存在demo.html时也可以
doc = pq(html) #pq(html) 得到处理过的html代码
doc('li') #css查找,对,我们在pyquery中用到了css查找法
doc('#container .list li') #名叫container 节点下有list属性的节点下的<li>标签
doc('.list') #属性是list
items.children('.active') # items下 属性为active的
items.parent() #item的父亲节点,一个父亲!
items.parents('.wrap') #item的所有父亲下 有wrap属性的
li = doc('.list .item-0.active') #属性是 list 下的 既有active又有item-0属性的标签
li.siblings() #所有兄弟节点
doc = pq(html) lis = doc('li').items() #items 产生一个生成器,通过循环提取 print(type(lis)) #<class 'generator'> for li in lis: print(li, type(li))
获取信息:
.attr获取属性
a = doc('.item-0.active a')print(a.attr('href'))
.text,.html 获取文本
doc = pq(html) li = doc('li') print(li.html()) #第一个节点的内部 html信息 print(li.text()) #所有节点的 文本信息,注意,不输出标签相关的信息。
节点操作
addClass
和 removeClass,
addClass()
和removeClass()
这些方法可以动态改变节点的class
属性
doc = pq(html) li = doc('.item-0.active') li.removeClass('active') #这标签里面去掉 active属性 li.addClass('active') #这标签里面加上 active 属性
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') #从属性入手,加一个name:是link print(li) li.text('changed item') #文本改为changed item print(li) li.html('<span>changed item</span>') # li 标签里面全改为 <span>changed item</span>
print(li)
标签删除
doc = pq(html) res = doc('.wrap') res.find('p').remove() #找到 <p> 标签删除 print(wrap.text())
伪类选择器 //之所以伪,可以理解为我们学习伪代码时候,那些语句也都很人性化容易理解
li = doc('li:first-child') #li下面的第一个儿子 li = doc('li:last-child') #li下的最后一个儿子
li = doc('li:nth-child(2)') #第二个儿子 li = doc('li:gt(2)') #第二个儿之后的所有儿子 li = doc('li:nth-child(2n)') #偶数儿子