如何用Python从SEC EDGAR提交文件中提取UU编码图片?
SEC EDGAR申报文件中UU编码图片解码问题解决方法
问题背景
从SEC EDGAR公开公司监管申报全文中,已能通过Python分离DOCUMENT标签分隔的文件,但其中的UU编码图片无法转存为JPG。尝试过标准库uu、base64及在线解码工具均失败,示例UU编码块包含行首M标记及HTML转义字符(如"、&)。
解决步骤
问题核心在于SEC文件中的UU编码经过了额外处理(行首加M、HTML转义),需先预处理再解码:
- 提取UU编码块:从申报文件中截取
begin到end之间的完整内容,排除begin和end行。 - 预处理编码内容:
- 移除每行开头的
M字符(及后续可能的空格) - 还原HTML转义字符:
"→"、&→&、<→<、>→>
- 移除每行开头的
- 使用
uu库解码并保存:将预处理后的内容传入uu.decode,输出二进制流保存为JPG文件。
代码示例
import uu import io # 假设已提取到UU编码块内容 uu_block = """begin 644 bxp-20241231_g3.jpg M_]C_X 02D9)1@ ! @$ 8 !@ #_[@ .061O8F4 90 !_]L 0P " 0$! M 0$" 0$! @(" @($ P(" @(%! 0#! 8%!@8&!08&!@<)" 8'"0<&!@@+" D* MTD)^'_\\ X%S?_&Z/^'_'_!&W_I(3\\/\\ _P "YO\\ XW7\\85% '[I?\\':7_!1S M]AW]MS]GCX2>%OV4/VE?#?CK4-#\\:7UUJUIH<SN]K"]H$5VW*."W%%?A;10! "_]D! end""" # 处理编码内容 lines = uu_block.splitlines() # 过滤无效行 data_lines = [line for line in lines if not line.startswith(('begin', 'end')) and line.strip()] processed_lines = [] for line in data_lines: # 移除行首的M及后续空格 if line.startswith('M'): line = line[1:].lstrip() # 还原HTML转义 line = line.replace('"', '"').replace('&', '&').replace('<', '<').replace('>', '>') processed_lines.append(line) # 拼接成符合UU编码标准的内容 processed_content = '\n'.join(processed_lines) + '\n' # 解码并保存图片 input_stream = io.StringIO(processed_content) output_stream = io.BytesIO() try: uu.decode(input_stream, output_stream) with open('bxp-20241231_g3.jpg', 'wb') as img_file: img_file.write(output_stream.getvalue()) print("图片解码保存成功") except Exception as e: print(f"解码失败: {str(e)}")
注意事项
uu库虽标记为“即将废弃”,但目前仍可正常使用;若需替代,可使用第三方库如python-uulib。- 若解码仍失败,检查是否有未处理的特殊转义字符,或编码块是否完整(需确保
begin和end之间的内容无缺失)。
内容的提问来源于stack exchange,提问作者Dan Brendel
相关产品推荐
相关产品推荐

