zoukankan      html  css  js  c++  java
  • Python爬虫(七)—类似jquery的 解析库 pyquery

    前言

    以下关于pyquery 的学习,主要记录常用的知识点,深入了解的查看官方文档。

    pyquery : https://pyquery.readthedocs.io/en/latest/

    JQuery : http://jquery.cuishifeng.cn/

    本文参照博客:https://www.cnblogs.com/zhaof/p/6935473.html

    pyquery

    pyquery允许您对xml文档进行jquery查询。API尽可能与jquery类似。pyquery使用lxml进行快速xml和html操作。

    pip install pyquery -i https://pypi.tuna.tsinghua.edu.cn/simple/

    from pyquery import PyQuery as pq

    <class ‘pyquery.pyquery.PyQuery’>对象

    • 字符串初始化
      print(doc(‘li’))
      doc其实就是一个pyquery对象,我们可以通过doc可以进行元素的选择,其实这里就是一个css选择器,所以CSS选择器的规则都可以用,直接doc(标签名)就可以获取所有的该标签的内容,如果想要获取class 则doc(’.class_name’),如果是id则doc(’#id_name’)
    • URL初始化
      在pq()这里可以传入url参数也可以传入文件参数,当然这里的文件通常是一个html文件,例如:pq(filename=‘index.html’)
    from pyquery import PyQuery as pq
    
    # 字符串初始化
    html = '''
    <div id="container">
        <ul class="list">
             <li class="item-1">one item</li>
             <li class="item-0 active" ><a href="link3.html"><span class="bold">two item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         </ul>
    </div>
    '''
    doc = pq(html)
    print(doc)
    print(type(doc))
    print(doc('li'))
    
    # URL初始化
    doc = pq(url="http://www.baidu.com",encoding='utf-8')
    print(doc('head'))
    

    CSS选择器

    • 样例
      需要注意的是:
      • 第二第三个li会保留前面的空格。
      • doc(’#container .list li’),这里的三者之间的并不是必须要挨着,只要是层级关系就可以
    html = '''
    <div id="container">
        <ul class="list">
             <li class="item-1">one item</li>
             <li class="item-0 active" ><a href="link3.html"><span class="bold">two item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         </ul>
    </div>
    '''
    doc = pq(html)
    print(doc('#container .list li'))
    """
    <li class="item-1">one item</li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">two item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
    """
    

    下面是常用的CSS选择器方法:

    写法样例含义
    **选择所有元素
    .class.colorclass="color"的所有元素
    #id#infoid="info"的所有元素
    elementp选择所有p标签元素
    element,elementdiv,p选择所有div标签和所有p标签元素
    element elementdiv p选择所有div标签下的所有p标签元素
    [attribute][class] [style]选择含有class属性下带有style属性的元素
    [attribute=value][class=“test”] [style]选择含有class属性为test下带有style属性的元素
    • 子元素
      children,find
      如下代码:

      doc = pq(html)
      items = doc('.list')
      print(items)
      
      lis = items.find('li')
      print(lis)
      
      li = items.children()
      # 在children里也可以用CSS选择器
      li2 = items.children('.active') print(li2)
      

      可以看出通过pyquery找到结果其实还是一个pyquery对象,可以继续查找,上述中的代码中的items.find(‘li’) 则表示查找ul里的所有的li标签。
      通过children可以实现同样的效果,并且通过.children方法得到的结果也是一个pyquery对象。

    • 父元素
      parent: 父元素的内容
      parents: 最上层父节点信息即祖先节点的信息
      items = doc(’.list’)

      container = items.parent()
      parents = items.parents()

      .parents查找的时候也可以添加css选择器来进行内容的筛选

    • 兄弟元素
      siblings
      li = doc(’.list .item-0.active’)
      print(li.siblings())

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

    遍历

    doc = pq(html)
    
    lis = doc('li').items()
    print(type(lis))
    for li in lis:
        print(li)
    """
    <class 'generator'>
    <li class="item-1">one item</li>
             
    <li class="item-0 active"><a href="link3.html"><span class="bold">two item</span></a></li>
             
    <li class="item-1 active"><a href="link4.html">fourth item</a></li>
    """
    

    通过items()可以得到一个生成器,并且我们通过for循环得到的每个元素依然是一个pyquery对象。
    需要注意的是,每个li都隔着一个空行,这是由于html每个li单独一行的原因。但是lis还是只有三个而并非六个

    获取信息

    • 获取属性
      pyquery对象.attr(属性名)
      pyquery对象.attr.属性名
    from pyquery import PyQuery as pq
    
    html = '''
    <div id="container">
        <ul class="list">
             <li class="item-1">one item</li>
             <li class="item-0 active" ><a href="link3.html"><span class="bold">two item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         </ul>
    </div>
    '''
    doc = pq(html)
    a = doc('.item-0.active a')
    print(a)
    print(a.attr('href'))
    print(a.attr.href)
    """
    <a href="link3.html"><span class="bold">two item</span></a>
    link3.html
    link3.html
    """
    
    • 获取文本
      .text()

    • 获取html
      .html()的方式可以获取当前标签所包含的html信息

    doc = pq(html)
    a = doc('.item-0.active a')
    print(a)
    print(a.text())
    print(a.html())
    """
    <a href="link3.html"><span class="bold">two item</span></a>
    two item
    <span class="bold">two item</span>
    """
    

    DOM操作

    内容略,需要可直接查看官方文档:https://pyquery.readthedocs.io/en/latest/manipulating.html

    个人博客:Loak 正 - 关注人工智能及互联网的个人博客
    文章地址:Python爬虫(七)—类似jquery的 解析库 pyquery

  • 相关阅读:
    LeetCode【125. 验证回文串】
    LeetCode【122. 买卖股票的最佳时机 II】
    LeetCode【121. 买卖股票的最佳时机】
    LeetCode【119. 杨辉三角 II】
    LeetCode【118. 杨辉三角】
    LeetCode【112. 路径总和】
    PAT1024
    PAT1020
    PAT1018
    PAT1017
  • 原文地址:https://www.cnblogs.com/l0zh/p/13739735.html
Copyright © 2011-2022 走看看