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