• 爬虫之解析库pyquery


    初始化

    安装: pip install pyquery

    字符串的形式初始化

    html = """
    <html lang="en">
        <head>
            简单好用的
            <title>PyQuery</title>
        </head>
        <body>
            <ul id="container">
                <li class="object-1">Python</li>
                <li class="object-2">大法</li>
                <li class="object-3"></li>
            </ul>
        </body>
    </html>
    """
    doc = pq(html)
    print(doc("title"))
    
    <title>PyQuery</title>

    URL初始化

    # PyQuery对象首先会请求这个url,用得到的HTML内容完成初始化
    doc = pq(url="https://www.cnblogs.com/songzhixue/")
    print(doc("title"))
    
    <title>村里唯一的架构师 - 博客园</title>&#13;
    
    
    doc = pq(requests.get("https://www.cnblogs.com/songzhixue/").text)
    print(doc("title"))
    
    <title>村里唯一的架构师 - 博客园</title>&#13;
    
    # 两种方法相同

    文件初始化

    # 读取本地的html文件以字符串的形式传递给PyQuery类来初始 化
    doc = pq(filename="demo.html")   # demo.html为本地文件
    print(doc("title"))

    css选择器

    html = """
    <html lang="en">
        <head>
            简单好用的
            <title>PyQuery</title>
        </head>
        <body>
            <ul id="container">
                <li class="object-1">Python</li>
                <li class="object-2">大法</li>
                <li class="object-3"></li>
            </ul>
        </body>
    </html>
    """
    # 先选取id为container的节点,在选取内部class属性为object-1的节点
    doc = pq(html)
    print(doc("#container .object-1"))
    print(type(doc("#container .object-1"))) # 输出类型还是PyQuery类型
    
    <li class="object-1">Python</li>
                
    <class 'pyquery.pyquery.PyQuery'>

    查找节点

    html = """
    <html lang="en">
        <head>
            简单好用的
            <title>PyQuery</title>
        </head>
        <body>
            <ul id="container">
                <li class="object-1">
                    Python
                    <span>你好</span>
                </li>
                <li class="object-2">大法</li>
                <li class="object-3"></li>
            </ul>
        </body>
    </html>
    """

    子节点

    获取所有子孙节点

    # 获取所有子孙节点
    doc = pq(html)
    a = doc("#container")
    lis = a.find("li")   # 查询的范围是节点的所有子孙节点
    print(lis)
    
    <li class="object-1">
                    Python
                    <span>你好</span>
                </li>
                <li class="object-2">大法</li>
                <li class="object-3">好</li>
            

    获取所有子节点

    # 获取所有子节点
    doc = pq(html)
    a = doc("#container")
    li = a.children()
    print(li)

    通过css选择器选择子节点中的某个节点

    # 通过css选择器选择子节点中的某个节点  筛选出子节点中class属性为object-1的节点
    doc = pq(html)
    a = doc("#container")
    li = a.children(".object-1")
    print(li)
    
    <li class="object-1">
                    Python
                    <span>你好</span>
                </li>

    父节点

    直接父节点

    # 这里的父节点是该节点的直接父节点
    doc = pq(html1)
    a= doc(".object-1")
    li = a.parent()
    print(li)
    
    <ul id="container">
                <li class="object-1">
                    Python
                    <span>你好</span>
                </li>
                <li class="object-2">大法</li>
                <li class="object-3">好</li>
            </ul>

    祖先节点

    # 获取所有父节点,即祖先节点
    doc = pq(html1)
    a = doc(".object-1")
    li = a.parents()
    print(li)
    # 结果会有两个,一个是父级节点一个是祖先节点

    通过css选择器选择父节点中的某个节点

    doc = pq(html1)
    a = doc(".object-1")
    li = a.parents("#container")
    print(li)
    
    <ul id="container">
                <li class="object-1">
                    Python
                    <span>你好</span>
                </li>
                <li class="object-2">大法</li>
                <li class="object-3">好</li>
            </ul>

    兄弟节点

    获取所有兄弟节点

    # 获取所有兄弟节点
    doc = pq(html)
    a = doc(".object-1")
    li = a.siblings()
    print(li)
    
    <li class="object-2">大法</li>
                <li class="object-3">好</li>

    通过css选择器选择兄弟节点中的某个节点

    # 通过css选择器选择兄弟节点中的某个节点
    doc = pq(html)
    a = doc(".object-1")
    li = a.siblings(".object-3")
    print(li)
    
    <li class="object-3">好</li>

    遍历

    - 上面选择节点的结果可能是多个节点,也可能是单个节点类型都是pyquery类型

    单个节点可以直接用str转换成字符串直接打印

    doc = pq(html)
    a = doc(".object-1")
    li = a.siblings(".object-3")
    print(str(li))
    print(type(str(li)))
    
    <li class="object-3">好</li>
            
    <class 'str'>

    查询结果为多个节点需要遍历来获取

    # 查询结果为多个节点需要遍历来获取
    # 多个节点需要调用items方法
    doc = pq(html)
    a = doc("li").items()    # 调用items会得到一个生成器
    print(a)
    
    for i in a:    # 循环生成器取出每个节点,类型也是pyquery
        print(i)
    
    
    <generator object PyQuery.items at 0x00000254B449CCA8>
    <li class="object-1">
                    Python
                    <span>你好</span>
                </li>
                
    <li class="object-2">大法</li>
                
    <li class="object-3">好</li>

    获取信息

    html = """
    <html lang="en">
        <head>
            简单好用的
            <title>PyQuery</title>
        </head>
        <body>
            <ul id="container">
                <li class="object-1">
                    Python
                    <a href="www.taobao.com">world</a>
                    <a href="www.baidu.com">hello</a>
                    
                </li>
                <li class="object-2">
                    大法
                    <a href="www.taobao.com">world</a>
                </li>
                <li class="object-3"></li>
            </ul>
        </body>
    </html>
    """

    获取属性

    # 找到某个节点后,就可以调用attr()方法来获取属性   
    a = doc(".object-1")
    # print(a.find("a").attr("href"))    
    # 当返回结果包含多个节点时,调用attr()方法只会得到第一个节点的属性
    
    # 如果想要获取所有a节点的属性,需要使用遍历
    for i in a.find("a").items():
        print(i.attr("href"))
    
    
    www.taobao.com
    www.baidu.com

    获取文本

    - 调用text()方法获取文本
    - 当我们得到的结果是多个节点时
        - text()  可以获取到匹配标签内的所有文本,返回的是所有文本内容组成的字符串
        - html()  返回的是匹配到的所有节点中的第一个节点内的html文本,如果想要获取所有节点中的html需要遍历

    获取纯文本

    # 获取纯文本
    doc = pq(html)
    li = doc("li")
    li = li.text()
    print(li)
    Python world hello 大法 world 好

    获取节点内的HTML

    # 获取节点内的HTML    带标签 只能获取匹配到的第一个节点内的HTML
    doc = pq(html)
    li = doc("li")
    print(li.html())
    
    Python
    <a href="www.taobao.com">world</a>
    <a href="www.baidu.com">hello</a>

    获取节点内的所有HTML

    # 遍历获取所有节点中的html
    doc = pq(html)
    li = doc("li")
    for i in li.items():
        print(i.html())
    
    Python
    <a href="www.taobao.com">world</a>
    <a href="www.baidu.com">hello</a>
    大法
    <a href="www.taobao.com">world</a>

    节点操作

    html = """
    <html lang="en">
        <head>
            简单好用的
            <title>PyQuery</title>
        </head>
        <body>
            <ul id="container">
                <li class="object-1">
                    Python
                    <a href="www.taobao.com">world</a>
                    <a href="www.baidu.com">hello</a>
                    
                </li>
                <li class="object-2">
                    大法
                    <a href="www.taobao.com">world</a>
                </li>
                <li class="object-3"></li>
            </ul>
        </body>
    </html>
    """

    删除属性

    doc = pq(html)
    a = doc(".object-2")
    print(a)
    a.removeClass("object-2")   # 删除object-2这个class属性
    print(a)
    
    <li class="object-2">
                    大法
                    <a href="www.taobao.com">world</a>
                </li>
                
    <li class="">
                    大法
                    <a href="www.taobao.com">world</a>
                </li>

    添加属性

    doc = pq(html)
    a = doc(".object-2")
    print(a)
    a.removeClass("object-2")   # 删除object-2这个class属性
    print(a)
    a.addClass("item")     # 给该标签添加一个item的class属性
    print(a)
    
    <li class="object-2">
                    大法
                    <a href="www.taobao.com">world</a>
                </li>
                
    <li class="">
                    大法
                    <a href="www.taobao.com">world</a>
                </li>
                
    <li class="item">
                    大法
                    <a href="www.taobao.com">world</a>
                </li>

    attr

    # 属性操作  【一个参数是查找 两个参数是设置属性】
    # 修改属性
    doc = pq(html)
    a = doc(".object-1")
    a.attr("name","henry")  # 给li标签添加一个name属性,值为henry
    print(a)
    
    <li class="object-1" name="henry">
                    Python
                    <a href="www.taobao.com">world</a>
                    <a href="www.baidu.com">hello</a>
                    
                </li>

    text

    # 文本操作  【有参数是添加或修改文本内容 没有参数是查找所有文本内容】
    # 文本内容操作
    doc = pq(html)
    a = doc(".object-1")
    a.text("hello world")
    print(a)
    
    <li class="object-1">hello world</li>

    html

    # 标签操作  【有参数是添加或修改标签 没有参数是查找第一个标签,获取所有需要遍历】
    # 标签操作
    doc = pq(html)
    a = doc(".object-1")
    a.html("<span>span标签</span>")
    print(a)
    
    <li class="object-1"><span>span标签</span></li>

    伪类选择器

    html = """
        <div class="wrap">
            <div id="container">
                <ul class="list">
                    <li class="item-0">fist item</li>
                    <li class="item-1"><a href="link1.html">second</a></li>
                    <li class="item-0 active"><a href="link2.html"><span class="bold">third item</span></a></li>
                    <li class="item-1 active"><a href="link3.html">fourth item</a></li>
                    <li class="item-0"><a href="link4.html">fifth item</a></li>
                </ul>
            </div>
        </div>
    """

    选择第一个节点

    # 选择第一个节点
    doc = pq(html)
    a = doc("li:first-child")
    print(a)
    
    <li class="item-0">fist item</li>

    选择最后一个节点

    # 选择最后一个节点
    doc = pq(html)
    a = doc("li:last-child")
    print(a)
    
    <li class="item-0"><a href="link4.html">fifth item</a></li>

    选择指定节点

    # 选择第2个li节点
    doc = pq(html)
    a = doc("li:nth-child(2)")
    print(a)
    
    <li class="item-1"><a href="link1.html">second</a></li>

    选择指定节点之后的节点

    # 选择第2个节点之后的所有节点
    doc = pq(html)
    a = doc("li:gt(2)")
    print(a)
    
    <li class="item-1 active"><a href="link3.html">fourth item</a></li>
                    <li class="item-0"><a href="link4.html">fifth item</a></li>

    选择偶数节点

    # 选择偶数位值节点
    doc = pq(html)
    a = doc("li:nth-child(2n)")
    print(a)
    
    <li class="item-1"><a href="link1.html">second</a></li>
                    <li class="item-1 active"><a href="link3.html">fourth item</a></li>

    包含哪些文本的节点

    # 包含second文本的节点
    doc = pq(html)
    a = doc("li:contains(second)")
    print(a)
    
    <li class="item-1"><a href="link1.html">second</a></li>
  • 相关阅读:
    java 连接SQL Server
    JAVA泛型
    JAVA 数组遍历
    JAVA注释
    Python正则表达式
    python练习题二
    Python函数
    Python练习题一
    重学python-列表的一些操作
    重学python-python-pandas库
  • 原文地址:https://www.cnblogs.com/songzhixue/p/11251847.html
Copyright © 2020-2023  润新知