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>