• Python3编写网络爬虫07-基本解析库pyquery的使用


    三、pyquery

    简介:同样是一个强大的网页解析工具 它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便

    安装:

    pip install pyquery

    验证:

    import pyquery

    初始化时 也需要传入HTML文本 初始化一个PyQuery对象 初始化方式有多种 例如直接传入字符串,传入URL,传入文件名等等。

    1. 字符串初始化

    示例:

    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-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>
    '''
    
    from pyquery import PyQuery as pq #引入PyQuery对象 取别名pq 
    doc = pq(html)#将html当作参数 传递给PyQuery类
    print(doc('li'))#传入li节点 选择所有li节点


    2. URL初始化

    doc = pq(url='https://www.huawei.com/cn/?',encoding='utf-8')
    print(doc('title'))

    pyquery对象首先请求url 得到HTML内容完成初始化 相当于用网页源代码 字符串的形式传递给pyquery类来初始化

    与下面的功能是一样的

    from pyquery import PyQuery as pq
    import requests
    doc = pq(requests.get('https://www.huawei.com').text)
    print(doc('title'))


    3.文件初始化

    doc = pq(filename='01.txt')
    print(doc('li'))

    最常见的还是字符串形式


    4.基本CSS选择器

    实例:

    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>
    '''
    
    from pyquery import PyQuery as pq
    doc = pq(html)
    print(doc('#container .list li'))#先选取 id 为container的节点 class为list的节点 所有li节点
    print(type(doc('#container .list li')))#pyquery类型

    5.查找节点

    # 常用的查询函数 与jQuery中函数用法完全相同

    5.1 find() 方法 查找所有子孙节点

    doc = pq(html)
    items = doc('.list')
    print(type(items))#pyquery类型
    print(items)#ul节点内容
    lis = items.find('li')#调用find()方法 参数必选
    print(type(lis))#类型为pyquery
    print(lis)#所有的li节点内容

    5.2 children() 查找子节点

    lis = items.children()#参数可选 例如 .active li等 进行元素过滤
    print(type(lis))#类型为pyquery
    print(lis)#子节点li


    5.3 parent() 获取某个节点的父节点

    示例:

    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">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>
    '''
    
    from pyquery import PyQuery as pq
    doc = pq(html)
    items = doc('.list')
    container = items.parent()
    print(type(container))
    print(container)#返回id 为container的节点内容


    5.4 parents() 获取某个节点的所有祖先节点

    items = doc('.list')
    parents = items.parents()
    print(parents)#没有给参数 所以会遍历上一层级 传递css参数 可筛选


    5.5 siblings() 获取所有兄弟节点

    li = doc('.list .item-0.active')
    print(li.siblings())#返回四个兄弟节点
    #筛选的话 在方法中加入参数
    print(li.siblings('.active'))#返回一个兄弟节点


    6. 遍历

    pyquery 选择结果可能是多个节点 也可能是单个节点 类型都是pyquery类型 没有返回向BS那样的列表

    对于单个节点 可以直接打印输出 也可以转化成字符串

    li = doc('.item-0.active')
    print(li)
    print(str(li))

    多个节点 遍历 需要调用 items()方法

    lis = doc('li').items()
    print(type(lis))#结果是生成器
    for li in lis:
    print(li,type(li))

    7. 获取信息

    attr() 获取属性值

    a = doc('.item-0.active a')
    print(a,type(a))
    print(a.attr('href'))#属性值为link3.html

    简写 print(a.attr.href)

    调用多个节点

    a = doc('a')
    print(a,type(a))
    print(a.attr('href'))
    print(a.attr.href)

    #返回结果只有第一个

    获取所有的a节点属性 遍历

    a = doc('a')
    for item in a.items():
    print(item.attr.href)

    text() 获取文本

    a = doc('.item-0.active a')
    print(a)
    print(a.text())#首先选中a节点 text()方法 获取其内部文本信息 忽略掉节点内部包含的HTML 只返回纯文本内容

    获取节点内部的HTML文本 html()方法

    li = doc('.item-0.active')
    print(li)#查找到第三个li节点
    print(li.html())#a节点内容

    选择到的是多个节点

    li = doc('li')
    print(li.html())#返回第一个节点的内部HTML文本
    print(li.text())#返回所有的li节点内部纯文本
    print(type(li.text()))#str 类型

    8. 节点操作

    pyquery提供了一系列方法对节点进行动态修改 例如给某个节点添加一个class 移除某个节点等

    列举几个典型方法

    8.1 addClass() 和 removeClass()

    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">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>
    </div>
    '''
    from pyquery import PyQuery as pq
    doc = pq(html)
    
    li = doc('.item-0.active')
    print(li)
    li.removeClass('active')#移除active属性
    print(li)
    li.addClass('active')#添加active属性
    print(li)


    8.2 attr()、text()、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>')#传入html文本
    print(li)

    attr() 传入一个参数的属性名 获取这个属性值 传入两个参数 修改属性值
    text() 获取节点内纯文本 传入参数进行赋值
    html() 获取节点内部的HTML文本 传入参数进行赋值

    8.3 remove() 移除

    示例: 提取 Hello,World 文本

    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())

    更多节点操作方法 http://pyquery.readthedocs.io/en/latest/api.html

    9.伪类选择器

    示例:

    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">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>
    </div>
    '''
    from pyquery import PyQuery as pq
    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之后的li节点
    print(li)
    
    li = doc('li:nth-child(2n)')#偶数位置的li节点
    print(li)
    
    li = doc('li:contains(second)')#包含second文本的li节点
    print(li)

    更多常用用法 参考官方文档 http://pyquery.readthedocs.io

  • 相关阅读:
    PCRE
    [转]如何解决严重的拖延症
    linux系统编程:setjmp和longjmp函数用法
    AWK中几个变量
    关于fork函数
    go mod
    golang+read_file+call_shell+goroutine
    vim for galang
    Linux install go
    为Git branch 打Tag
  • 原文地址:https://www.cnblogs.com/liuxiaosong/p/10337082.html
Copyright © 2020-2023  润新知