鱼C论坛

 找回密码
 立即注册

pc730

已有 516 次阅读2018-7-30 21:22

使用pyquery
同BeautifulSoup一样,初始化pyquery的时候同样先要初始化一个pyquery对象。可以直接传入字符串。传入url
传入文件名等等
html='''
<ul>
<li class='item-0'>first item</li>
<li class='item-1'><a href='link2.html'>secend item</a></li>
<li class='item-0 active'><a href='link3.html'><span class='bold'>third item</a></li>
<li class='ltem-1 active'><a href='linl4.html'>fourth item</a></li>
<li class='item-0'><a href='link5.html'>fifith item</a></li>
</ul>
'''
from pyquery import PyQuery as pq
doc=pq(html)
print(doc('li'))
这里先引入pyquery对象,命名为pq,然后声明了一个长字符串html,将其作为参数传入pq类,这样就完成了
初始化。然后将对象传入css选择器。这个实例中,我们传入li节点,这样就可以选择所有li节点。

url初始化:
我们可以以字符串/网页的url形式初始化参数。
from pyquery import PyQuery as pq
doc=pq(url='http://cuiqingcai.com')
print(doc('title'))
这样的话pqquery会先请求这个url,利用得到的html完成初始化
下面的代码可以得到一样的结果:
from pyquery import PyQuery as pq
import requests
doc=pq(requests.get('http://cuiqingcai.com').text)
print(doc('title'))

文件初始化:
from pyquery import PyQuery as pq
doc=pq(filename='demo.html')
print(doc('li'))
以上需要一个本地文件demo.html,这样就会先读取本地的文件内容,以字符串的形式传递给pyquery类

基本的css选择器
html='''
<div id='container'>
<ul class='list'>
<li class='item-0'>first item</li>
<li class='item-1'><a href='link2.html'>secend item</a></li>
<li class='item-0 active'><a href='link3.html'><span class='bold'>third item</a></li>
<li class='ltem-1 active'><a href='linl4.html'>fourth item</a></li>
<li class='item-0'><a href='link5.html'>fifith item</a></li>
</ul>
'''
from pyquery import PyQuery as pq
doc=pq(html)
print(doc('#container.list li')
print(type(doc('#container.list li')))
这里我们首先初始化了一个对象,传入了一个css选择器#container.list.li,他的意思就是选取id为
container的节点,然后继续选取内部的class为list的节点内部的所有li节点,然后打印输出。

查找结点
1:查找子节点
html='''
<div id='container'>
<ul class='list'>
<li class='item-0'>first item</li>
<li class='item-1'><a href='link2.html'>secend item</a></li>
<li class='item-0 active'><a href='link3.html'><span class='bold'>third item</a></li>
<li class='ltem-1 active'><a href='linl4.html'>fourth item</a></li>
<li class='item-0'><a href='link5.html'>fifith item</a></li>
</ul>
'''
from pyquery import PyQuery as pq
doc=pq(html)
items=doc('.list')
print(type(items))
print(items)
lis=items.find('li')
print(type(lis))
print(lis)
这里我们选取了class为list的节点,然后调用了find()方法,传入css选择器,选取内部的li节点最后输出
find()会讲内部所有符合条件的节点选择出来。
其实。find()方法查找范围是所有子孙节点
如果只想查找子节点,可以用children方法。
lis=items.children()
print(type(lis))
print(lis)
如果想筛选所有子节点中符合条件的节点,比如筛选出子节点中class为active的节点,可以向children()
方法中传入css选择器.active:
lis=items.children('.active')
print(lis)

父节点当然是用parent()
from pyquery import PyQuery as pq
doc=pq(html)
items=doc('.list')
container=items.parent()
print(type(container))
print(container)
这里我们先用.list选取class为list的节点,然后调用parents()得到其父节点,仅仅是父节点,不是祖先节点。
如果获取祖先节点,可以用parents()
from pyquery import PyQuery as pq
doc=pq(html)
items=doc('.list')
parents=items.parents()
print(type(parents))
print(parents)
parents()方法可以输出所有祖先节点。
如果只想要祖先节点的某个节点的话,可以向parents传入css选择器。
parent=items.parents('.wrap')
print(parent)

兄弟节点
兄弟节点的获取依赖于siblings()方法。
from pyquery import PyQuery as pq
doc=pq(html)
li=doc('.list.item-0.active')
print(li.siblings())
这里首先选择class为list的节点内部class为item-0和active的节点,很明显兄弟节点是1,2,4,5个li节点

如果要筛选某个兄弟节点
from pyquery import PyQuery as pq
doc=pq(html)
li=doc('.list.item-0.active')
print(li.sibling('.active'))
这里仅仅筛选class为active的兄弟节点。

遍历
在puquery中,对于多个节点的获取,我们需要用到遍历。
例如我们想遍历每个li节点,就要用到items()方法。
from pyquery import PyQuery as pq
doc=pq(html)
lis=doc('li').items()
print(type(lis))
for li in lis:
print(li,type(li))
调用items()方法后,会得到一个生成器对象,遍历一下就可以得到li节点对象了。
每个li节点还可以调用前面所说的方法进行选择。

捕获信息:
获取属性:
我们一旦提取到PYQuery类型的节点之后,可以调用attr()方法来获取属性。
from pyquery import PyQuery as pq
doc=pq(html)
a=doc('.item-0.active a')
print(a,type(a))
print(a.attr('href'))
这里选中class为item-0和active的li节点内的a节点。然后调用attr()方法,传入属性的名称,则可以获得该属性的值
当返回结果包含多个节点是,调用attr()方法,只会获得第一个节点的属性。这种情况又是遍历解决啦
再进行属性获取时,可以观察返回节点是一个还是多个,如果是多个,则需要遍历才能依次获取每个节点的属性
获取文本:
方法是text():
from pyquery import PyQuery as pq
doc=pq(html)
a=doc('.item-0.active a')
print(a)
print(a.text())
这里的话首先选中一个a节点,再调用text()方法,获取其内部的文本信息,他返回的内容是忽略了所有节点的纯文字
这里text()方法不需要遍历,它可以将所有节点取文本之后合并成一个字符串。

节点操作
html='''
<div id='container'>
<ul class='list'>
<li class='item-0'>first item</li>
<li class='item-1'><a href='link2.html'>secend item</a></li>
<li class='item-0 active'><a href='link3.html'><span class='bold'>third item</a></li>
<li class='ltem-1 active'><a href='linl4.html'>fourth item</a></li>
<li class='item-0'><a href='link5.html'>fifith item</a></li>
</ul>
'''
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)
一共输出三次,第二次输出移除了actice这个class,第三次又恢复过来了。
所以说,addClass()和removeClass()可以动态改变节点的class属性
同样,attr()可以对属性进行操作,text()和html()方法可以改变节点内部的内容
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')
print(li)
这里我们首先选中了li节点,然后用attr()方法修改属性,第一个变量为参数名,第二个变量为参数值,接着
调用text()和html()方法修改节点内部的内容。 

remove()意思就是移除,有事会为信息的提取带来非常大的便利
html='''
<div class='wrap'>
hello,world
<p>This is a paragraph.</p>
'''
from pyquery import PyQuery as pq
doc=pq(html)
wrap=dpc('.wrap')
print(wrap.text())
如果现在我们只想要hello world这个字符,而不想要p节点内部的字符串:
wrap.find('p').remove()
print(wrap.text())
这时我们移除了p结点,wrap内部只剩下了hello,world,然后就可以用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'>secend item</a></li>
<li class='item-0 active'><a href='link3.html'><span class='bold'>third item</a></li>
<li class='ltem-1 active'><a href='linl4.html'>fourth item</a></li>
<li class='item-0'><a href='link5.html'>fifith item</a></li>
</ul>
'''
from pyquery import PyQuery as pq
doc=pq(hrml)
li=doc('li:first-child')   #选择了第一个li节点
li=doc('li:last-child')#最后一个节点
li=doc('li:nth-child(2)')#第二个节点
li=doc('li:gt(2)')#第三个li之后的节点
li=doc('li:nth-child(2n)')#偶数位数的节点
li=doc('li:contains(second)')#包含second文本的li节点
















路过

雷人

握手

鲜花

鸡蛋
收藏 分享邀请 举报

全部作者的其他最新日志

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-16 14:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部