如何用Python提取PDF含关键词行及解决TXT跨多行作者名提取难题
问题1:如何使用Python从PDF文件中提取所有包含关键词的行?
推荐使用pdfplumber库来处理PDF文本提取,它对文本换行的保留更精准,能减少格式错乱的问题。
步骤与代码示例
- 先安装依赖库:
pip install pdfplumber
- 提取含关键词的行:
import pdfplumber def extract_lines_with_keywords(pdf_path, keywords): result_lines = [] with pdfplumber.open(pdf_path) as pdf: for page in pdf.pages: text = page.extract_text() if not text: continue # 按原始换行分割文本 lines = text.split('\n') for line in lines: stripped_line = line.strip() # 检查当前行是否包含任意目标关键词 if any(keyword in stripped_line for keyword in keywords): result_lines.append(stripped_line) return result_lines # 使用示例:提取包含"人工智能"或"机器学习"的行 target_lines = extract_lines_with_keywords("sample.pdf", ["人工智能", "机器学习"]) for line in target_lines: print(line)
如果需要更简单的方案,也可以用PyPDF2,但它的文本提取可能会出现换行错乱,需要额外处理格式问题。
问题2:提取多个TXT文件中包含作者姓名的行(处理跨行拆分情况)
你的现有代码只能处理单行完整姓名的情况,针对姓名跨行拆分的问题,可以通过合并可能的相邻姓名行或检查连续行的组合匹配来解决。
优化方案代码
import os authors = ['Francesca Donato', 'Marisa Matias', 'Ignazio Corrao'] def merge_possible_name_lines(raw_lines): merged_lines = [] i = 0 while i < len(raw_lines): current = raw_lines[i].strip() # 检查当前行是否可能是姓名的一部分,且下一行非空 if current and i + 1 < len(raw_lines): next_line = raw_lines[i+1].strip() # 判定条件:两行首字母都大写(姓名特征),或当前行以连字符结尾(拆分的长姓名) if (current.istitle() and next_line.istitle()) or current.endswith('-'): # 处理连字符拆分的情况 if current.endswith('-'): combined = current[:-1] + next_line else: combined = f"{current} {next_line}" merged_lines.append(combined) i += 2 continue merged_lines.append(current) i += 1 return merged_lines def extract_author_content(txt_path): results = [] with open(txt_path, 'r', encoding='utf-8') as f: raw_lines = [line.rstrip() for line in f] # 生成合并后的行,同时保留原行避免遗漏 merged_lines = merge_possible_name_lines(raw_lines) all_check_lines = list(dict.fromkeys(raw_lines + merged_lines)) # 去重 for line in all_check_lines: for author in authors: if author in line: results.append(line) break # 找到匹配后跳出循环,避免重复添加 return results # 批量处理文件夹下的所有TXT文件 txt_folder = "your_txt_directory" all_results = [] for filename in os.listdir(txt_folder): if filename.endswith('.txt'): file_path = os.path.join(txt_folder, filename) all_results.extend(extract_author_content(file_path)) # 输出最终结果 for line in all_results: print(line)
补充优化思路
如果作者名单极大,还可以把作者姓名拆分为单词集合,检查连续2-3行的组合是否包含完整的作者名单词,进一步提升匹配灵活性:
from itertools import islice def check_consecutive_lines(lines, author): author_words = set(author.lower().split()) # 检查连续2行的组合 for i in range(len(lines)-1): combined_text = ' '.join(lines[i:i+2]).lower() combined_words = set(combined_text.split()) if author_words.issubset(combined_words): return ' '.join(lines[i:i+2]).strip() return None
内容的提问来源于stack exchange,提问作者Ann
相关产品推荐
相关产品推荐

