You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python提取PDF含关键词行及解决TXT跨多行作者名提取难题

问题1:如何使用Python从PDF文件中提取所有包含关键词的行?

推荐使用pdfplumber库来处理PDF文本提取,它对文本换行的保留更精准,能减少格式错乱的问题。

步骤与代码示例

  1. 先安装依赖库:
pip install pdfplumber
  1. 提取含关键词的行:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:50:15