鱼C论坛

 找回密码
 立即注册
查看: 1808|回复: 5

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

[复制链接]
发表于 2023-7-22 00:34:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

def search_keywords_in_pdf_directory(directory, keyword):
    # 获取目录下的所有PDF文件路径
    pdf_files = [os.path.join(directory, filename) for filename in os.listdir(directory) if filename.endswith('.pdf')]

    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[start_line:end_line]

                    # 在关键字所在行将关键字标记为红色
                    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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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:\'  # 修改为实际的目录路径,注意添加原始字符串前缀rsearch_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文件。另外,确保在关键字输入时使用合适的语法。

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

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 = [os.path.join(directory, filename) for filename in os.listdir(directory) if filename.endswith('.pdf')]

    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[start_line:end_line]

            # 在关键字所在行将关键字标记为红色
            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库时,你可能需要对代码进行一些调整以确保其能够正常工作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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('搜索结束!')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 20:39:32 | 显示全部楼层
从给出的代码来看,问题可能出在以下几个方面:

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

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

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

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

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

请对以上方面进行检查,并确保代码中的每个部分都按预期工作。如果问题仍然存在,请提供更多详细信息,以便我能够帮助你解决问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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('搜索结束!')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 09:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表