pyquery的使用

1.快速入门
  • 简介

    pyquery更适合用于CSS选择器。

  • 实例

    from pyquery import PyQuery as pq #引入PyQuery对象,取别名为pq
    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-inactive'><a href='link3.html'><span class='bold'>thrid item</span></a></li>
    <li class='item-1'><a href='link4.html'>fourth item</a></li>
    <li class='item-0'><a href='link5.html'>fifth item</a>
    </ul>
    </div>
    '''
    doc=pq(html)
    print(doc('li'))
    print(type(doc('li')))

    输出:所有li节点

  • URL初始化

    初始化的参数不仅可以以字符串的形式传递,还可以传入网页的url

    from pyquery import PyQuery as pq
    doc=pq(url='https://ejgdlyz.github.io')
    '''
    类似于
    from pyquery import PyQuery as pq
    import requests
    doc=pq(requests.get('https://ejgdlyz.github.io').text)
    print(doc('title'))
    '''
    print(doc('title'))
  • 文件初始化

    from pyquery import PyQuery
    doc=pq(filename='demo.html')
    print('li')
2.基本CSS选择器
from pyquery import PyQuery
html='''
<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-1 active'><a href='link3.html'><span class='bold'>thrid 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>
</ul>
</div>
'''
doc=PyQuery(html)
print(doc('#container .list li'))
print(type(doc('#container .list li')))
'''
输出
<li class="item-0">first item</li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html"><span class="bold">thrid item</span></a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</li>
<class 'pyquery.pyquery.PyQuery'>
'''
3.查找结点
  • 子节点

    查找子节点时,可以用find()方法。参数为css选择器。

    from pyquery import PyQuery as pq
    #以前面的html为例
    doc=pq(html)
    items=doc('.list')
    print(type(items))
    print(items)
    lis=items.find('li')#选取其内部的所有li节点。find()方法会将所有符合条件的节点选择出来,结果类型为PyQuery类型
    print(type(lis))
    print(lis)
    #find()查找的范围时子孙节点,若只查找子节点,可以用children()方法
    lis=items.children()
    #lis=items.children('.active')
    print(type(lis))
    print(lis)
  • 父节点

  items=doc('.list')
  container=items.parent()
  print(type(container))
  print(container)
  '''
  输出
  <class 'pyquery.pyquery.PyQuery'>
  <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">thrid 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>
  '''

这里的父节点是该节点的直接父节点,它不会去查找父节点的父节点。

若想要获得祖先节点,可以使用parents()方法。parents()方法会返回所有祖先节点。

  doc=pq(html)
  items=doc('.list')
  parents=items.parents()
  print(type(parents))
  print(parents)

parents()方法也可以传入css选择器

  parent=items.parents('.list')
  print(parent)
  • 兄弟节点

    siblings()方法获取兄弟节点。

    doc=pq(html)
    li=doc('.list .item-0.active')
    print(li.siblings())

    输出兄弟节点4个。

    也可以向siblings()传入css选择器。

    print(li.siblings('.active'))
4.遍历

pyquery的选择结果可能是多个节点,也可能是单个节点,类型都是PyQuery类型。

对于单个节点,可以打印输出,也可以转成字符串打印输出。

doc=pq(html)
li=doc('.item-0.active')
print(li)
print(str(li)[:10])
'''
输出
<li class="item-0 active"><a href="link3.html"><span class="bold">thrid item</span></a></li>
<li class=
'''

对于多个节点的结果,遍历获取。例如,遍历每一个li节点,需要items()方法。

lis=doc('li').items()#得到一个生成器,遍历,得到li对象,类型为PyQuery类型
print(type(lis))
for li in lis:
    print(li,type(li))
'''
<class 'generator'>
<li class="item-0">first item</li>
 <class 'pyquery.pyquery.PyQuery'>
<li class="item-1"><a href="link2.html">second item</a></li>
 <class 'pyquery.pyquery.PyQuery'>
<li class="item-0 active"><a href="link3.html"><span class="bold">thrid item</span></a></li>
 <class 'pyquery.pyquery.PyQuery'>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
 <class 'pyquery.pyquery.PyQuery'>
<li class="item-0"><a href="link5.html">fifth item</a>
</li> <class 'pyquery.pyquery.PyQuery'>
'''
5.获取信息
  • 获取属性

    提取到某个PyQuery类型的节点后,就可以调用attr()方法来获取属性。

    from pyquery import PyQuery as pq
    html='''
    <div class='mydiv'>
    <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'>thrid 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>
    </ul>
    </div>
    </div>
    '''
    doc=pq(html)
    a=doc('.item-0.active a')
    print(a,type(a))
    print(a.attr('href'))
    #print(a.attr.href)

    当返回结果有多个时,就需要进行遍历。

    a=doc('a').items()
    print(type(a))
    for A in a:
        print(A.attr('href'))
    '''
    运行输出
    <class 'generator'>
    link2.html
    link3.html
    link4.html
    link5.html
    '''
  • 获取文本

    调用text()方法来获取文本。

    #同上
    a=doc('.item-0.active a')
    print(a)
    print(a.text())#忽略节点内部的html文本,返回纯文字内容
    '''
    运行输出
    <a href="link3.html"><span class="bold">thrid item</span></a>
    thrid item
    '''

    若想要获取节点内的html文本,可以用html()方法

    li=doc('.item-0.active')
    print(li)
    print(li.html())
    '''
    运行输出
    <li class="item-0 active"><a href="link3.html"><span class="bold">thrid item</span></a></li>
    
    <a href="link3.html"><span class="bold">thrid item</span></a>
    '''

    当返回结果是多个节点时,text()会将所有文本内容进行拼接,而html()只返回第一个节点的html文本内容。

    doc=pq(html)
    lis=doc('li')
    print(lis.text())
    print(lis.html())
    '''
    运行输出
    first item second item thrid item fourth item fifth item
    first item
    '''
6.节点操作

pyquery提供了一系列方法来对节点进行动态修改,为某个节点添加一个class,移除节点等。

  • addClass和removeClass

    from pyquery import PyQuery as pq
    html='''
    <div class='mydiv'>
    <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'>thrid 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>
    </ul>
    </div>
    </div>
    '''
    doc=pq(html)
    li=doc('.item-0.active')
    print(li)
    li.removeClass('active')#移除active属性
    print(li)
    li.add_class('active')#添加active属性
    print(li)
    '''
    运行输出
    <li class="item-0 active"><a href="link3.html"><span class="bold">thrid item</span></a></li>
    <li class="item-0"><a href="link3.html"><span class="bold">thrid item</span></a></li>
    <li class="item-0 active"><a href="link3.html"><span class="bold">thrid item</span></a></li>
    '''
  • attr,text,html

    html='''
    <ul class='list'>
    <li class='item-0 active'><a href='link3.html'><span class='bold'>thrid item</span></a></li>
    </ul>
    '''
    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 class="item-0 active"><a href="link3.html"><span class="bold">thrid item</span></a></li>
    
    <li class="item-0 active" name="link"><a href="link3.html"><span class="bold">thrid item</span></a></li>
    
    <li class="item-0 active" name="link">changed item</li>
    
    <li class="item-0 active" name="link"><span>changed item</span></li>
    '''

    attr()方法只传一个参数的属性名,就获取这个属性值,传入第二个参数,可以用来修改属性值。

    text()和html()方法如果不传参数,则获取节点内纯文本和html文本,如果传入参数,则进行赋值。

  • remove()

    html='''
    <div class='div1'>
        Hello World!
    <p>This is a p Tag</p>
    </div>
    '''
    from pyquery import PyQuery as pq
    doc=pq(html)
    div=doc('.div1')
    print(type(div))
    print(div.text())
    #如果只提取Hello world!这个字符串
    print(div.find('p'))
    div.find('p').remove()
    print(div.text())
    '''
    <class 'pyquery.pyquery.PyQuery'>
    Hello World!
    This is a p Tag
    <p>This is a p Tag</p>
    
    Hello World!
    '''
7.伪类选择器
from pyquery import PyQuery as pq
html='''
<div class='mydiv'>
<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'>thrid 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>
'''
doc=pq(html)
li=doc('li:first-child')#输出第一个li节点
print(li)
li=doc('li:last-child')#最后一个li节点
print(li)
li=doc('li:nth-child(2)')#第二个li节点
print(li)
li=doc('li:gt(2)')#输出第三个之后的li节点
print(li)
li=doc('li:nth-child(2n)')#偶数位置的li节点
print(li)
li=doc('li:contains(second)')#包含second的li节点
print(li)
'''
运行输出
<li class="item-0">first item</li>

<li class="item-0"><a href="link5.html">fifth item</a></li>

<li class="item-1"><a href="link2.html">second item</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>

<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>

<li class="item-1"><a href="link2.html">second item</a></li>

'''

   转载规则


《pyquery的使用》 White Spider 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录