当前位置: 首页 > article >正文

python代码实现问卷星问卷内容获取并写入word文档保存

 以下附完整代码。

import os
from tkinter import Tk, simpledialog, messagebox
from docx import Document
import time
import requests
import re
from tkinter import ttk

# 使用 tkinter 创建一个简单的输入框来获取用户输入的问卷链接
root = Tk()
root.title("问卷星内容获取")
root.geometry("360x180")

# 创建一个输入框
url_label = ttk.Label(root, text="\n请输入问卷星问卷的链接:")
url_label.pack(pady=10)
url_entry = ttk.Entry(root)
url_entry.pack(pady=10)

# 创建一个按钮框架
button_frame = ttk.Frame(root)
button_frame.pack(pady=10)

# 创建“取消”按钮
cancel_button = ttk.Button(button_frame, text="取消", command=root.destroy)
cancel_button.pack(side="left", padx=10)

# 创建“确定”按钮
ok_button = ttk.Button(button_frame, text="确定", command=lambda: get_url(url_entry.get()))
ok_button.pack(side="right", padx=10)


def get_url(url):
    headers = {'User-Agent':
                   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.60'
               }

    resp = requests.get(url=url, headers=headers)
    page_content = resp.text

    # 提取问卷标题
    title_obj = re.compile(r"<title>(.*?)</title>", re.S)
    title_match = title_obj.search(page_content)
    if title_match:
        title = title_match.group(1)
    else:
        title = "问卷星试卷"  # 如果没有找到标题,使用默认标题

    # 保存为 Word 文档时使用问卷标题
    doc = Document()

    obj = re.compile(r"<div class='topichtml'>(?P<question>.*?)</div>.*?"
                     r"<div class='label' dit='.*?' for='q.*?_1'>(?P<A>.*?)</div>.*?"
                     r"<div class='label' dit='.*?' for='q.*?_2'>(?P<B>.*?)</div>.*?"
                     r"<div class='label' dit='.*?' for='q.*?_3'>(?P<C>.*?)</div>.*?"
                     r"<div class='label' dit='.*?' for='q.*?_4'>(?P<D>.*?)</div>.*?", re.S)

    # 这里将迭代器转换为列表
    result = list(obj.finditer(page_content))

    print(f"正在从{url}获取资源...")
    time.sleep(2)

    question_number = 1  # 初始化问题编号

    # 创建一个新的窗口来显示进度
    progress_window = Tk()
    progress_window.title("资源获取进度")
    progress_window.geometry("400x180")

    # 在进度窗口中显示进度信息
    progress_label = ttk.Label(progress_window, text="正在获取资源...")
    progress_label.pack(pady=10)

    for it in result:
        question = it.group('question')
        A = it.group('A')
        B = it.group('B')
        C = it.group('C')
        D = it.group('D')

        # 在 Word 文档中添加内容,并在问题前添加序号
        doc.add_paragraph(f"{question_number}. {question}")
        doc.add_paragraph(A)
        doc.add_paragraph(B)
        doc.add_paragraph(C)
        doc.add_paragraph(D)
        doc.add_paragraph()  # 添加空行

        time.sleep(0.5)
        question_number += 1  # 问题编号加一

        # 更新进度窗口中的进度信息
        progress_label.config(text=f"\n\n获取资源中,请稍候...\n\n加载进度:问题 {question_number}/{len(result)}")
        progress_window.update()

    # 检查文件夹是否存在,如果不存在则创建
    if not os.path.exists("D:/问卷星"):
        os.makedirs("D:/问卷星")

    # 使用问卷标题保存 Word 文档
    doc.save(f"D:/问卷星/{title}.docx")

    # 关闭进度窗口
    progress_window.destroy()


    # 使用 messagebox 显示完成信息
    messagebox.showinfo("完成", f"资源获取完成并已保存到D盘 {title}.docx 文件中")

    # 自动跳转到文档保存的路径
    os.startfile(f"D:/问卷星")

    root.destroy()  # 关闭窗口


root.mainloop()


http://www.kler.cn/a/420511.html

相关文章:

  • TypeScript和JavaScript区别详解
  • 是什么阻断了kafka与zk的链接?
  • ES中的字段类型
  • [Redis#13] cpp-redis接口 | set | hash |zset
  • Vue 90 ,Element 13 ,Vue + Element UI 中 el-switch 使用小细节解析,避免入坑(获取后端的数据类型自动转变)
  • Qt 面试题学习11_2024-11-29
  • 基于灰色神经网络的订单需求预测
  • el-table 纵向 横向 多级表头
  • Mysql实现定时自动清理日志(Windows环境)
  • 3. STM32_串口
  • 【无标题】在ensp中配置isis协议
  • 信创改造 - Redis -》TongRDS 安装方式之单节点模式安装
  • Scratch游戏推荐 | 星际前线:帝国逆袭——揭开帝国野心,挑战星际极限!
  • spider--某站搜索--自动化dp
  • ASP.NET Core MVC 入门
  • html+css+js网页设计 旅游 厦门旅游网14个页面
  • Java函数式编程【二】【Stream的装饰】【中间操作】【map映射器】【摊平映射器flatMap】
  • IPv6 如何实现网络安全?
  • 统信服务器操作系统V20系列配置JDK方案
  • 【java-Neo4j 5进阶篇】- 1.批量新增数据
  • 1128作业
  • Debezium Engine监听binlog实现缓存更新与业务解耦
  • redhat 7.9配置阿里云yum源
  • Android 原生解析 Json 字符串
  • 《Vue零基础入门教程》第十五课:样式绑定
  • 黑马程序员MybatisPlus/Docker相关内容