pyquery学习笔记

前言

该文章为学习崔庆才大大教程时,做的一些笔记。

好记性不如烂笔头

简介

PyQuery库也是一个非常强大又灵活的网页解析库,前端基础较好的人,使用更加方便,上手快,且功能更强大。

官方文档: http://pyquery.readthedocs.io/

使用
  • 初始化
    • 字符串初始化
    • URL初始化
    • 文件初始化 (对于本机文件)
1
2
3
4
5
6
7
8
9
10
11
12
# 演示数据
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-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>
'''
1
2
3
4
5
6
7
8
9
10
11
12
13
from pyquery import PyQuery as pq
doc = pq(html) # 字符串初始化
doc = pq('http://www.baidu.com') # URL初始化
doc = pq('文件路径') # 文件初始化

print(doc('li'))
# 类似BeautifulSoup的tag选择器
# 与BeautifulSoup的区别,pyquery的该语句会匹配所有满足条件的内容

# 以演示数据为例:
[<li.item-0>, <li.item-1>, <li.item-0.active>, <li.item-1.active>, <li.item-0>]
# 该列表是由<class 'pyquery.pyquery.PyQuery'>类型构成的
# doc也是<class 'pyquery.pyquery.PyQuery'>类型,即pyquery可以层层调用
  • 基本的css选择器(id,class)
    1
    2
    3
    4
    5
    6
    print(doc(' #container'))   #加‘ # ’id选择
    print(doc('.item-0')) #加‘ . ’class选择
    print(doc('#container .list li')) # 选择id为continer下,类名为list的标签内的li
    print(doc('#continer .item-0')) # 选择id为container的标签下的,类名为item-0的内容
    print(doc('#continer .item-0.active')) # 选择id为container的标签下的,类名为item-0&acitve的内容
    # 中间带有空格表示层级,不带空格表示并列
  • 查找元素
    • 子元素
    • 父元素
    • 兄弟元素
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      from pyquery import PyQuery as pq
      doc = pq(html)
      items = doc('.list')
      print(type(items))
      print(items)

      # 子元素的查找
      # find方法
      lis = items.find('li') # tag
      print(type(lis))
      print(lis)

      # children方法
      lis = items.children('.active') # css选择器
      print(lis)
      # 两种方法,都可以使用css选择器和tag
      # 区别: find找下面所有满足条件的下级元素
      # children找直接子元素里满足条件的内容
      # 父元素查找
      # parent方法(得到上一级父元素)
      container = items.parent()
      print(type(container))
      print(container)

      # parents方法(得到所有祖先元素)
      parents = items.parents()
      print(type(parents ))
      print(container)
      # 类型均为<class 'pyquery.pyquery.PyQuery'>
      # 也可以使用css和tag进行筛选

      # 兄弟查找
      # siblings方法
      doc = pq(html)
      li = doc('.list .item-0.active') # css选择
      print(li.siblings()) # 类型<class 'pyquery.pyquery.PyQuery'>
  • 遍历

    当我们通过pyquery进行筛选时,我们可以获得一条结果,也可能获得多条,当结果不唯一时,我们会用到遍历

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 当然,我们可以使用最基础的for方法
    doc = pq(html)
    b = doc('li') # 类型<class 'pyquery.pyquery.PyQuery'>
    for a in b:
    print(a) # 类型<class 'lxml.etree._Element'>

    # 我们可以借助pyquery提供的items方法
    lis = doc('li').items() # 类型<generator object PyQuery.items at 0x03568A50>
    print(type(lis))
    for li in lis:
    print(li) # 类型<class 'pyquery.pyquery.PyQuery'>

    ### 注意区分各个值的类型,根据需要进行选择
    # 使用itens()函数后,每个子项为py类型,可以使用查找函数
  • 获取信息
    • 获取属性
    • 获取文本
    • 获取HTML
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      from pyquery import PyQuery as pq
      doc = pq(html)
      a = doc('.item-0.active a')
      print(a)

      # 获取属性(2种方法)
      print(a.attr('href'))
      print(a.attr.href)

      # 获取文本
      print(a.text())

      # 获取HTML
      >>>print(li)
      <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
      >>>print(li.html()) # 获取其包裹的HTML
      <a href="link3.html"><span class="bold">third item</span></a>
  • DOM操作

    对dom进行修改,增删

    • addClass、removeClass

    • attr、css

    • remove

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      from pyquery import PyQuery as pq
      doc = pq(html)
      li = doc('.item-0.active')
      print(li)
      # 原始结果
      <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>
    • removeClass

      1
      2
      3
      4
      5
      6
      7
      8
      li.removeClass('active')  # 移除active类的属性
      print(li)
      # 结果
      <li class="item-0">first item</li>
      <li class="item-1"><a href="link2.html">second item</a></li>
      <li class="item-0"><a href="link3.html"><span class="bold">third 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>
    • addClass

      1
      2
      3
      4
      5
      6
      7
      li.addClass('active')
      print(li)
      <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>
    • attr、css

      1
      2
      3
      4
      li.attr('name', 'link')
      # 若li无name属性,则添加name="link";若具有name属性,则修改其值为link
      li.css('font-size', '14px')
      # 添加样式,同attr
    • remove

      可以用于筛选,排除,进而获取最后内容

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      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())
      wrap.find('p').remove()
      print(wrap.text())

      # 结果为:
      Hello, World This is a paragraph.
      Hello, World
  • 进阶

    和前端css选择器完全一致,均可以使用

    1
    2
    3
    4
    5
    # 举例 (伪类选择器)
    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc('li:first-child')
    print(li)