PyQuery库的基本使用

PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严格实现。语法与 jQuery 几乎完全相同,所以不用再去费心去记一些奇怪的方法了。

官网地址:http://pyquery.readthedocs.io/en/latest/
jQuery参考文档: http://jquery.cuishifeng.cn/

初始化

初始化的时候一般有三种传入方式:传入字符串,传入url,传入文件

字符串初始化

html = '''

'''
from pyquery import PyQuery as pq
doc = pq(html) #主要是理解这步即可
print(type(doc))
print(doc('li'))

输出如下:


  • first item
  • second item
  • third item
  • fourth item
  • fifth item
  • 由于PyQuery写起来比较麻烦,所以我们导入的时候都会添加别名:
    from pyquery import PyQuery as pq
    这里我们可以知道上述代码中的doc其实就是一个pyquery对象,我们可以通过doc可以进行元素的选择,其实这里就是一个css选择器,所以CSS选择器的规则都可以用,直接doc(标签名)就可以获取所有的该标签的内容,如果想要获取class 则doc('.class_name'),如果是id则doc('#id_name')....
    URL初始化

    from pyquery import PyQuery as pq
    "https://www.baidu.com"
    doc = pq(url="https://www.baidu.com" ,encoding="utf-8")
    print(type(doc))
    print(doc('div'))
    

    在传URL的时候可以选择输出的编码,比如我上面这个例子,如果不加encoding容易出现乱码。
    输出如下:


    文件初始化
    我们先将html以记事本的形式存入文档

    
    from pyquery import PyQuery as pq
    
    doc = pq(filename=r'C:\Users\董贺贺\Desktop\测试.txt')
    print(type(doc))
    print(doc('li')) 
    

    输出结果如下:

    
    
  • first item
  • second item
  • third item
  • fourth item
  • fifth item
  • 基本的CSS选择器

    html = '''
    
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    print(type(doc))
    print(doc('#container .list li'))
    

    输出结果如下:

    
    
  • first item
  • second item
  • third item
  • fourth item
  • fifth item
  • 这里我们需要注意的一个地方是doc('#container .list li'),这里的三者之间的并不是必须要挨着,只要是层级关系就可以,下面是常用的CSS选择器方法:

    查找元素

    子元素
    children,find
    代码例子:

    html = '''
    
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    print(type(doc))
    item = doc('.list')
    print(type(item))
    print(type(item.find('li')))
    print(item.find('li'))
    

    输出如下:

    
    
    
    
  • first item
  • second item
  • third item
  • fourth item
  • fifth item
  • 从结果里我们也可以看出通过pyquery找到结果其实还是一个pyquery对象,可以继续查找,上述中的代码中的items.find('li') 则表示查找ul里的所有的li标签
    当然这里通过children可以实现同样的效果,并且通过.children方法得到的结果也是一个pyquery对象

    html = '''
    
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    print(type(doc))
    item = doc('.list')
    li = item.children()
    print(li)
    

    输出结果:

    
    
  • first item
  • second item
  • third item
  • fourth item
  • fifth item
  • 同时在children中还可以用CSS方法

    html = '''
    
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    print(type(doc))
    items = doc('.list')
    li = items.children('.active')
    print(li)
    

    输出如下:

    
    
  • third item
  • fourth item
  • 父元素
    parent,parents方法
    通过.parent就可以找到父元素的内容,例子如下:

    html = '''
    
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    items = doc('.list')
    container = items.parent()
    print(container)
    

    输出如下:

    
    
    

    .parent()方法是查找的父元素,通过.parents()就可以找到祖先节点的内容,例子如下:

    html = '''
    
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    items = doc('.list')
    container = items.parents()
    print(container)
    
    

    输出如下:

    
     
    

    同样我们通过.parents查找的时候也可以添加css选择器来进行内容的筛选

    html = '''
    
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    items = doc('.list')
    container = items.parents('.wrap')
    print(container)
    
    

    输出如下:

    
    

    兄弟元素
    siblings

    html = '''
    
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc('.list .item-0.active')
    lis = li.siblings()
    print(lis)
    

    输出如下:

  • second item
  • first item
  • fourth item
  • fifth item
  • 代码中doc('.list .item-0.active') 中的.tem-0和.active是紧挨着的,所以表示是并的关系,这样满足条件的就剩下一个了:thired item的那个标签了
    这样在通过.siblings就可以获取所有的兄弟标签,当然这里是不包括自己的
    同样的在.siblings()里也是可以通过CSS选择器进行筛选

    html = '''
    
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc('.list .item-0.active')
    lis = li.siblings('.item-0')
    print(lis)
    
    

    输出如下:

  • first item
  • fifth item
  • 遍历
    单个元素

    html = '''
    
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc('.item-0.active')
    print(li)
    
    lis = doc('li').items()
    for li in lis:
        print(type(li))
        print(li)
    

    运行结果如下:从结果中我们可以看出通过items()可以得到一个生成器,并且我们通过for循环得到的每个元素依然是一个pyquery对象。
    输出如下:

  • third item
  • first item
  • second item
  • third item
  • fourth item
  • fifth item
  • 获取信息

    获取属性
    pyquery对象.attr(属性名)
    pyquery对象.attr.属性名

    html = '''
    
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    a = doc(".item-0.active a")
    print(a)
    
    print(a.attr('href'))
    print(a.attr.href)
    

    输出如下:

    third item
    link3.html
    link3.html
    

    个人比较喜欢第一种写法
    所以这里我们也可以知道获得属性值的时候可以直接a.attr(属性名)或者a.attr.属性名
    获取文本
    在很多时候我们是需要获取被html标签包含的文本信息,通过.text()就可以获取文本信息

    html = '''
    
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    a = doc(".item-0.active a")
    print(a)
    
    print(a.text())
    

    输出如下:

    third item
    third item
    

    获取html
    我们通过.html()的方式可以获取当前标签所包含的html信息,例子如下:

    html = '''
    
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    lis = doc('#container .list li').items()
    print(lis)
    for li in lis:
        print(li.html())
    

    输出如下:

    first item
    second item
    third item
    fourth item
    fifth item
    

    DOM操作

    addClass、removeClass
    熟悉前端操作的话,通过这两个操作可以添加和删除属性

    html = '''
    
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc('#container .list .item-1.active')
    print(li)
    li.remove_class('active')
    print(li)
    li.add_class('active')
    print(li)
    

    输出如下:

  • fourth item
  • fourth item
  • fourth item
  • attr,css
    同样的我们可以通过attr给标签添加和修改属性,
    如果之前没有该属性则是添加,如果有则是修改
    我们也可以通过css添加一些css属性,这个时候,标签的属性里会多一个style属性

    html = '''
    
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    li = doc('.item-0.active')
    print(li)
    li.attr('name', 'link')
    print(li)
    li.css('font-size', '14px')
    print(li)
    

    结果如下:

  • third item
  • third item
  • third item
  • remove
    有时候我们获取文本信息的时候可能并列的会有一些其他标签干扰,这个时候通过remove就可以将无用的或者干扰的标签直接删除,从而方便操作

    html = '''
    
    Hello, World

    This is a paragraph.

    ''' 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
    
    

    pyquery中DOM的其他api操作参考:http://pyquery.readthedocs.io/en/latest/api.html

    你可能感兴趣的:(PyQuery库的基本使用)