Python解析CIS基准PDF转Excel:跨页关键词文本提取问题求助
跨页关键词文本提取问题
核心问题是提取跨页的两个关键词之间的文本。部分CIS规则会跨页延续,但现有Python脚本无法处理该场景,尝试过通过TXT文件中转去除PDF格式,问题仍未解决。
以下是相关代码:
import os import PyPDF2 import re import tkinter as tk from tkinter import filedialog import openpyxl # 定义要搜索的关键词列表 keywords = ["description", "rationale", "impact", "audit", "remediation", "cis control"] def extract_text_from_pdf(pdf_path, txt_path, excel_path): try: with open(pdf_path, 'rb') as pdf_file: pdf_reader = PyPDF2.PdfReader(pdf_file) num_pages = len(pdf_reader.pages) workbook = openpyxl.Workbook() worksheet = workbook.active # 构造不带": "且将空格替换为下划线的新关键词 new_keywords = [keyword.replace(": ", "").replace(" ", "_") for keyword in keywords] # 添加列标题作为第一行 worksheet.append(["Num Page and rule"] + new_keywords) for page_num in range(num_pages): page = pdf_reader.pages[page_num] text = page.extract_text() # 提取前两行 first_two_lines = text.split('\n', 2)[:2] first_two_lines_text = ' '.join(line.strip() for line in first_two_lines) # 搜索关键词之间的文本,支持上下文解析 keyword_data = {} for i in range(len(keywords) - 1): start_keyword = keywords[i] end_keyword = keywords[i + 1] pattern = re.compile(f'{start_keyword}(.*?){end_keyword}', re.DOTALL | re.IGNORECASE) matches = pattern.findall(text) keyword_data[start_keyword] = matches # 单独处理'cis control'关键词 cis_control_matches = re.findall(r'cis\s*control\s*\((.*?)\)', text, re.DOTALL | re.IGNORECASE) keyword_data['cis control'] = cis_control_matches # 将提取的文本添加到工作表 max_rows = max(len(keyword_data[keyword]) for keyword in keywords) for row in range(max_rows): values = [first_two_lines_text] for keyword in keywords: keyword_column = keyword.replace(" ", "_") if row < len(keyword_data[keyword]): values.append(keyword_data[keyword][row].strip()) else: values.append("") worksheet.append(values) workbook.save(excel_path) print(f"已从'{pdf_path}'提取文本并保存到'{excel_path}'。") except Exception as e: print(f"错误: {e}") def browse_pdf(): file_path = filedialog.askopenfilename(filetypes=[("PDF文件", "*.pdf")]) if file_path: txt_file_path = os.path.splitext(file_path)[0] + ".txt" excel_file_path = os.path.splitext(file_path)[0] + ".xlsx" extract_text_from_pdf(file_path, txt_file_path, excel_file_path) # 创建文件浏览窗口 file_path = filedialog.askopenfilename(filetypes=[("PDF文件", "*.pdf")]) if file_path: txt_file_path = os.path.splitext(file_path)[0] + ".txt" excel_file_path = os.path.splitext(file_path)[0] + ".xlsx" extract_text_from_pdf(file_path, txt_file_path, excel_file_path)
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

