ssqchina 发表于 2023-7-22 00:34:24

搜索不出结果,问题出在哪?

#pip install PyPDF2
import os
import re
from PyPDF2 import PdfReader

def search_keywords_in_pdf_directory(directory, keyword):
    # 获取目录下的所有PDF文件路径
    pdf_files =

    results = []
    for pdf_file in pdf_files:
      with open(pdf_file, 'rb') as file:
            pdf = PdfReader(file)

            for page_num, page in enumerate(pdf.pages, start=1):
                text = page.extract_text()

                # 使用正则表达式在文本中搜索关键字
                pattern = re.compile(r'\b{}\b'.format(keyword), flags=re.IGNORECASE)
                matches = re.finditer(pattern, text)

                for match in matches:
                  match_text = match.group(0)
                  match_page = page_num + 1

                  # 获取关键字所在的行及其上下行内容
                  lines = text.split('\n')
                  start_line = max(match.start() - 1, 0)
                  end_line = min(match.end() + 1, len(lines))

                  context_lines = lines

                  # 在关键字所在行将关键字标记为红色
                  highlighted_lines = []
                  for line in context_lines:
                        highlighted_line = line.replace(match_text, '\033[91m{}\033[0m'.format(match_text))
                        highlighted_lines.append(highlighted_line)

                  result = {
                        'file': pdf_file,
                        'page': match_page,
                        'context': highlighted_lines
                  }
                  results.append(result)

    return results

# 示例用法
directory_path = 'e:\\'# 修改为实际的目录路径
search_keyword = input('请输入要查询的内容')

search_results = search_keywords_in_pdf_directory(directory_path, search_keyword)

for result in search_results:
    print('文件名:', result['file'])
    print('页数:', result['page'])
    print('上下文:')
    for line in result['context']:
      print(line)
    print()

Mike_python小 发表于 2023-7-22 00:34:32

问题分析:
根据您提供的代码和错误信息,发现了以下问题:

1. 缩进错误:在for pdf_file in pdf_files:循环和其后的代码中,缺少了必要的缩进。请确保在with open(pdf_file, 'rb') as file:和其后的代码块之前正确缩进。

2. 路径问题:您提供的示例代码中,将目录路径设置为'e:\\'。请确保这个目录路径存在,并且其中包含PDF文件以供搜索。

解决方案:
请尝试进行以下修改:


# 示例用法
directory_path = r'e:\'# 修改为实际的目录路径,注意添加原始字符串前缀r
search_keyword = input('请输入要查询的内容')

search_results = search_keywords_in_pdf_directory(directory_path, search_keyword)

for result in search_results:
    print('文件名:', result['file'])
    print('页数:', result['page'])
    print('上下文:')
    for line in result['context']:
      print(line)
    print()


请注意,修改后的目录路径应该是实际存在的,并且包含您想要搜索的PDF文件。另外,确保在关键字输入时使用合适的语法。

希望以上解决方案能够帮助您解决问题。如果还有其他疑问,请随时提出。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-7-22 00:35:16

从你的代码来看,主要在PDF文件中搜索关键字并高亮显示关键字。如果你的代码不能产生期望的结果,那么可能的问题有以下几种:

1. PDF文件内容的提取问题:PyPDF2并不是最好的库来提取PDF中的文本。PyPDF2有时不能正确地解析PDF中的文本。如果你试图在无法正确解析的PDF文件中搜索关键字,那么很有可能搜索不到。你可以尝试使用别的库来提取PDF中的文本,比如PDFMiner。

2. 正则表达式的问题:你用的正则表达式\b{}\b能够确保你搜到的词是一个完整的词,而不是某个词的一部分。然而,它可能会错过一些特殊情况。比如,如果你的关键字是 "open",那么 "opened" 和 "opening" 就会被错过。你需要根据你的实际需求修改你的正则表达式。

3. 字符编码问题:如果你的PDF文件包含非ASCII字符,PyPDF2可能不能正确地解码这些字符。这可能会导致你的搜索失败。你可以尝试使用别的库来解决这个问题,比如PDFMiner。

以下是你的代码改用PDFMiner的版本:

#pip install pdfminer.six
import os
import re
from pdfminer.high_level import extract_text

def search_keywords_in_pdf_directory(directory, keyword):
    # 获取目录下的所有PDF文件路径
    pdf_files =

    results = []
    for pdf_file in pdf_files:
      text = extract_text(pdf_file)

      # 使用正则表达式在文本中搜索关键字
      pattern = re.compile(r'\b{}\b'.format(keyword), flags=re.IGNORECASE)
      matches = re.finditer(pattern, text)

      for match in matches:
            match_text = match.group(0)

            # 获取关键字所在的行及其上下行内容
            lines = text.split('\n')
            start_line = max(match.start() - 1, 0)
            end_line = min(match.end() + 1, len(lines))

            context_lines = lines

            # 在关键字所在行将关键字标记为红色
            highlighted_lines = []
            for line in context_lines:
                highlighted_line = line.replace(match_text, '\033[91m{}\033[0m'.format(match_text))
                highlighted_lines.append(highlighted_line)

            result = {
                'file': pdf_file,
                'context': highlighted_lines
            }
            results.append(result)

    return results

# 示例用法
directory_path = 'e:\\'# 修改为实际的目录路径
search_keyword = input('请输入要查询的内容')

search_results = search_keywords_in_pdf_directory(directory_path, search_keyword)

for result in search_results:
    print('文件名:', result['file'])
    print('上下文:')
    for line in result['context']:
      print(line)
    print()


注意:此段代码不再提供页码信息,因为PDFMiner的 extract_text 方法会返回整个PDF文件的文本,而不是单个页面的文本。如果需要在找到关键字的同时提供关键字所在的页码,你可能需要使用PDFMiner的更底层的API。

请注意,在使用新的PDF库时,你可能需要对代码进行一些调整以确保其能够正常工作。

ssqchina 发表于 2023-7-22 00:46:36

isdkz 发表于 2023-7-22 00:35
从你的代码来看,主要在PDF文件中搜索关键字并高亮显示关键字。如果你的代码不能产生期望的结果,那么可能 ...

这个比我那个更费时,但是还是找不出
我原来代码能找出
import os
from PyPDF2 import PdfReader

def search_keywords_in_pdf(directory, keyword):
    files = os.listdir(directory)
    for file in files:
      if file.endswith('.pdf'):
            file_path = os.path.join(directory, file)
            with open(file_path, 'rb') as f:
                pdf = PdfReader(f)
                for page_num, page in enumerate(pdf.pages, start=1):
                  text = page.extract_text()
                  if keyword in text:
                     print(f"found '{keyword}' in {file} (Page {page_num})")

# 指定要搜索的目录和关键字
directory = 'e:\\'
keyword = input('请输入要查询的内容')

search_keywords_in_pdf(directory, keyword)
print('搜索结束!')

陶远航 发表于 2023-7-22 20:39:32

从给出的代码来看,问题可能出在以下几个方面:

目录路径错误:确保directory_path变量中存储的是正确的目录路径。如果找不到目录或者没有权限访问该目录,就无法搜索到文件。

PDF文件格式错误:代码使用PyPDF2库来解析PDF文件,但并不是所有的PDF文件都可以被成功解析。请确保要搜索的PDF文件是有效的、可读取的文件,并且使用的是支持的PDF版本。

关键字匹配问题:正则表达式中的\b用于匹配单词边界,以确保只匹配完整单词而不是单词的一部分。如果关键字包含特殊字符或者连续的空格,可能会导致匹配失败。请确保输入的关键字符合预期并且存在于PDF文本中。

编码问题:有些PDF文件使用非标准编码或特殊字符集,可能会导致提取文本时出现乱码或异常结果。这可能需要进行额外的处理或使用其他库来解决。

代码逻辑错误:上述代码基本上是正确的,但仍然可能存在某些逻辑错误。例如,获取关键字所在行及其上下行内容时,起始行和结束行的计算是否正确等。你可以检查代码中的每个步骤,以确定哪个步骤导致了问题。

请对以上方面进行检查,并确保代码中的每个部分都按预期工作。如果问题仍然存在,请提供更多详细信息,以便我能够帮助你解决问题。

ssqchina 发表于 2023-7-22 21:56:15

陶远航 发表于 2023-7-22 20:39
从给出的代码来看,问题可能出在以下几个方面:

目录路径错误:确保directory_path变量中存储的是正确的 ...

修改之前的代码能运行
import os
from PyPDF2 import PdfReader

def search_keywords_in_pdf(directory, keyword):
    files = os.listdir(directory)
    for file in files:
      if file.endswith('.pdf'):
            file_path = os.path.join(directory, file)
            with open(file_path, 'rb') as f:
                pdf = PdfReader(f)
                for page_num, page in enumerate(pdf.pages, start=1):
                  text = page.extract_text()
                  if keyword in text:
                     print(f"found '{keyword}' in {file} (Page {page_num})")

# 指定要搜索的目录和关键字
directory = 'e:\\'
keyword = input('请输入要查询的内容')

search_keywords_in_pdf(directory, keyword)
print('搜索结束!')
页: [1]
查看完整版本: 搜索不出结果,问题出在哪?