这段代码是一个Python脚本,用于从指定的URL下载并解析JSON数据,然后使用这些数据生成一个Word文档(.docx)。下面是逐行代码的注释说明:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 指定脚本执行环境和文件编码方式
import os # 导入os模块,用于文件系统操作
import urllib2 # 导入urllib2模块,用于发送HTTP请求(注:在Python 3中已被requests替代)
import json # 导入json模块,用于处理JSON数据
import sys # 导入sys模块,用于访问与Python解释器相关的变量和函数
reload(sys) # 在Python 2中用于重新加载sys模块,Python 3已移除此用法
sys.setdefaultencoding('utf-8') # 设置默认字符串编码为UTF-8(Python 3中不需要此操作)
# 引入python-docx库相关部分,用于Word文档操作
from docx import Document
from docx.oxml.ns import qn
from docx.shared import Pt
import config # 导入配置文件config中的设置
import log # 导入日志处理模块log
logger = log.Log(config.log_dir, config.log_name) # 初始化日志记录器
# 定义下载并处理Word文档的类
class DownDocx(object):
def __init__(self, fileDir, url, info): # 初始化方法,接收文件目录、URL和文档信息
self.fileDir = './' + fileDir + '/' # 构建文件保存的目录路径
self.URL = url # 保存下载链接
self.WkInfo = info # 保存文档信息
if not os.path.exists(self.fileDir): # 如果目录不存在则创建
os.mkdir(self.fileDir)
@staticmethod # 静态方法,不依赖实例变量
def geturl(urls, index): # 根据索引获取特定页面的URL
for url in urls:
if url['pageIndex'] == index:
return url['pageLoadUrl']
return '' # 如果找不到对应索引的URL,返回空字符串
def down(self): # 下载文档的方法
reqHeader = config.reqHeaderBDWK # 获取请求头配置
reqHeader['Referer'] = self.URL # 设置Referer头
i = 1 # 初始化页码计数器
docFileName = self.fileDir + self.WkInfo['title'] + '.' + self.WkInfo['docType'] # 构建保存的文件名
document = Document() # 创建一个新的Word文档对象
while i <= self.WkInfo['totalPageNum']: # 遍历所有页面
jsonUrl = self.geturl(self.WkInfo['htmlUrls']['json'], i) # 获取当前页的JSON URL
if not jsonUrl: # 如果未找到URL,则报错并返回
logger.error('下载文档失败,查找URL失败!')
return False
jsonUrl = jsonUrl.replace('\\', '').replace(' ', '%20') # 清理URL
req = urllib2.Request(jsonUrl, headers=reqHeader) # 构建请求
res = urllib2.urlopen(req).read() # 发送请求并读取响应
jsonRet = res[res.find('(')+1 : res.rfind(')')] # 提取有效JSON数据
logger.info('打印一下,获取json数据内容为 ' + jsonRet)
jsonRet = json.loads(jsonRet) # 解析JSON数据
first = 0 # 初始化段落标记
for item in jsonRet['body']: # 遍历页面内容
if item['t'] != 'word': # 跳过非文本类型的数据
continue
if first == 0 or (item['ps'] and item['ps']['_enter'] == 1):
first = 1
pg = document.add_paragraph() # 新增段落
if item['ps'] and item['ps']['_enter'] == 1:
continue # 跳过换行标记
run = pg.add_run(item['c']) # 添加文本到段落
run.font.name = u'宋体' # 设置字体为宋体
run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体') # 设置东亚区域字体为宋体
run.font.size = Pt(10.5) # 设置字体大小为10.5磅
if i < self.WkInfo['totalPageNum']: # 如果不是最后一页,添加分页符
document.add_page_break()
i += 1 # 增加页码计数
document.save(docFileName) # 保存文档
return True # 成功完成下载和转换
请注意,代码中使用了urllib2
库,这是Python 2中的标准库。在Python 3中,应使用urllib.request
和urllib.error
替代。此外,脚本开头的setdefaultencoding
在Python 3中不再需要,因为Python 3默认使用UTF-8编码。