zoukankan      html  css  js  c++  java
  • python中pyquery库的css选择器实战解析

    1.pyquery部分选择器解释

    """pyquery的CSS选择器方法"""
    from pyquery import PyQuery
    
    
    html = """
    <div id="container">
    <table class="tablelist" cellpadding="0" cellspacing="0">
        <tr class="h">
            <td class="l" width="374">职位名称</td>
            <td>职位类别</td>
            <td>人数</td>
            <td>地点</td>
            <td>发布时间</td>
        </tr>
    </table>    
    </div>
    """
    # 传递html内容初始化
    res = PyQuery(html)
    # CSS选择器方法进行选择。#container为ID选择方法,.tablelist为class选择方法,tr为标签选择方法
    # 这句的意思是选择ID为container节点内部的class为tablelist的节点中所有tr标签内容
    print(res("#container .tablelist tr"))
    # <class 'pyquery.pyquery.PyQuery'> 类型为PyQuery类型
    print(type(res("#container .tablelist tr")))
    
    """
    # 常用CSS选择器方法介绍
    find()      查找结点的所有子孙节点
    children()  查找子节点,也可以在括号中添加想要查找的子节点类型
    parent()    获取目标的父节点
    parents()   获取所有的祖先节点,可以在括号中添加css选择器选取想要的祖先节点
    siblings()  兄弟节点,选择除本身之外的兄弟节点,可添加css选择器
    # 选择完成之后会有许多节点,这需要遍历
    items()     返回一个生成器,使用for循环就可以打印出来。循环的每一个节点还是PyQuery类型可以继续CSS选择器选择
    # 获取属性和文本信息
    attr()      获取找到的第一个属性,找多个需要循环遍历
    text()      获取所有文本以空格分割开并合并成一个字符串
    html()      获取找到的第一个html文本,找多个需要循环遍历
    # 节点操作
    addClass()      增加class属性
    removeClass()   移除class属性
    remove()        删除find("xx").remove()找到的指定内容
    attr()          增加节点属性
    text()          增加节点文本内容
    html()          增加节点html内容
    http://www.w3school.com.cn/css/index.asp    # CSS教程
    """
    
    
    # 伪类选择器
    doc = PyQuery(html)
    # 第一个td节点
    td = doc("td:first-child")
    print(td)
    # 最后一个td节点
    td = doc("td:last-child")
    print(td)
    # 第二个td节点
    td = doc("td:nth-child(2)")
    print(td)
    # 第三个td节点之后的td节点
    td = doc("td:gt(2)")
    print(td)
    # 偶数位置的td节点
    td = doc("td:nth-child(2n)")
    print(td)
    # 包含、地点、文本的td节点
    td = doc("td:contains(地点)")
    print(td)
    View Code

    2.pyquery三种解析方法的选择

    """CSS选择器库,熟悉web和jquery可以选择此解析库"""
    from pyquery import PyQuery
    import requests
    
    
    # 第一种解析方法,直接传入url进行请求然后用得到的HTML内容进行初始化
    res = PyQuery(url="https://www.sogou.com/")
    # css中的标签选择方法打印title标签和内容
    print(res("title"))
    
    
    # 第二种常规解析方法,用网页的源代码以字符串的形式传递给PyQuery类来初始化
    rew = PyQuery(requests.get("https://www.sogou.com/").text)
    print(rew("title"))
    
    
    # 文件解析.可以选取一个本地HTML文件进行解析
    req = PyQuery(filename="index.html")
    print(req("title"))
    View Code

    3.pyquery实战解析之存储到txt文件

    """pyquery实战解析之数据存储"""
    import requests
    from pyquery import PyQuery
    
    
    # 获取url
    url = "https://www.gushiwen.org/default_1.aspx"
    # 获取请求头信息
    headers={"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3554.0 Safari/537.36"}
    # 发送get请求并获取请求的文本字符串
    html = requests.get(url=url, headers=headers).text
    # 将获取的文本字符串转换为PyQuery对象
    pq = PyQuery(html)
    # 使用css选择器并调用items()方法生成迭代器
    items = pq(".cont").items()
    # 循环遍历
    for item in items:
        # 调用find()方法并采用css选择器中的标签选择获取标题。
        title = item.find("p b").text()
        # 获取结果类型为字符串,可以调用split()方法进行分割。分割之后为列表类型
        contents = item.find("p a").text().split(" ")
        # 根据获得的结果进行判断
        if len(contents) == 1:
            continue
        # 朝代
        dynasty = contents[1]
        # 作者
        author = contents[2]
        # 调用children()方法并采用css选择器中的标签选择获取文本内容
        text = item.children(".contson").text()
        # f = open("poetry.txt", "a", encoding="utf-8")
        # f.write("
    ".join([title, dynasty, author, text]))
        # f.write("
    " + "=" * 100 + "
    ")
        # f.close()     # 此种文件操作模式完成之后需要调用close()方法主动关闭文件
        # 打开.txt文件,以"a"追加的方式写入utf-8编码的数据内容并给出可操作的文件句柄f
        with open("poetry.txt", "a", encoding="utf-8") as f:
            # with as 语法执行文件操作之后会自动关闭打开的文件,所以不用调用close()方法
            f.write("
    ".join([title, dynasty, author, text]))
            f.write("
    " + "=" * 100 + "
    ")
    View Code
  • 相关阅读:
    知识搜索
    使用 getopt() 进行命令行处理
    【新提醒】夏新大v安卓4.1尝鲜最新更新版本发布(包含进步版)1124更新 大V综合交流区 360论坛
    搜狗知立方高调亮相 开启知识计算新时代
    socat: Linux / UNIX TCP Port Forwarder
    Crontab 每两周执行一次
    python 命令行解析 optionparser
    crontab jojo's blog--快乐忧伤都与你同在 BlogJava
    搜索引擎开始「实体搜索」新领域竞争,Google、百度分别发力实体搜索产品
    netcat(nc)的替代产品 Socat
  • 原文地址:https://www.cnblogs.com/Guishuzhe/p/10247399.html
Copyright © 2011-2022 走看看