python 我如何搜索多个关键字,出现PDF的,从一个目录的PDF文件(约5000 PDF)

vwkv1x7d  于 2023-02-28  发布在  Python
关注(0)|答案(2)|浏览(185)

我对python比较陌生,但是我决定尝试一下biuld这个工作工具,它将在我们的PDF文档的一个子部分中查找用户输入的某些ketwords。
到目前为止,我一次搜索1个关键字效果很好,而且我已经成功地升级了GUI。但是,我不能在文档中搜索超过1个关键字/短语。例如,我想搜索一个名字,这样我就可以输入这个名字,而且效果很好,它birngs我回到所有的PDF文件中出现这个名字(这是伟大的)。但当我试图添加另一个搜索词/短语,我不能得到这个工作。
例如,如果我想搜索系统中的所有史密斯先生,然后搜索药物名称(我在毒理学领域工作),我想输入:史密斯,扑热息痛但这没用.
它只对孤立的史密斯先生有效。我想这是因为它使用的是精确的文本,但我不知道如何添加更多的关键词。
任何帮助是赞赏,我已经张贴了我的代码到目前为止,其中包括所有的图形用户界面的东西

import requests,webbrowser
from bs4 import BeautifulSoup
from tkinter import *
import os
import fitz
import os
import customtkinter

path= r'O:\Sent Questions'
files = os.listdir(path)

customtkinter.set_appearance_mode("dark")
root = customtkinter.CTk()
root.geometry("700x350") 
root.title("Questions Keyword Search")

label=customtkinter.CTkLabel(root,text="Questions Keyword Search Engine",font=("Inter",30))
label.pack(side=TOP) 
text=StringVar()
def search():
    global entry
    Search = entry.get()
    print(Search)
    for file in files:
        doc=fitz.open(path+'\\'+file)
        for page in doc:
            text = page.get_text()
            # print(text)
            result = text.find(Search)
            if result != -1:
                print(file)
                pass

            #need to add another loop the key words for, so for each page in dock again search for more keywords
            
label_1=customtkinter.CTkLabel(root,text="Enter Keywords Below",font=("Inter",15))
label_1.place(x=275,y=100)

label_2=customtkinter.CTkLabel(root,text="You can input as many as you'd like but they must be in double quotation marks and split by commas",font=("Inter",12))
label_2.place(x=97,y=130)

label_3=customtkinter.CTkLabel(root,text='Example: cocaine, SoHT, LC-MS',font=("Inter",12))
label_3.place(x=250,y=150)

entry=customtkinter.CTkEntry(master=root,width=200)
entry.place(x=252,y=190)
button=customtkinter.CTkButton(master=root,text="Search",command=search)
button.place(x=285,y=230)
root.mainloop()

input("prompt: ")
vnzz0bqm

vnzz0bqm1#

您似乎要选择其中提到用户输入的***所有***关键字的页面。
我会要求用户用逗号分隔关键字,不要强制使用双撇号作为分隔符。然后用逗号分隔用户输入,以获得用户关键字列表。为了避免大小写问题,请将所有内容都转换为小写:关键字和提取的文本。您的选择将如下所示:

def search():
    global entry
    Search = entry.get()
    kw_list = Search.lower().split(",")

    for file in files:
        doc=fitz.open(path+'\\'+file)
        for page in doc:
            text = page.get_text().lower()
            for kw in kw_list:
                if kw not in text:  # skip page for any missing keyword
                    continue
            # all keywords occurs on this page!
            print(f"found on page {page.number+1} of file {doc.name}")

不确定选择逻辑是否符合您的要求。也许您想不那么严格,如果至少有n-1个关键字或其他东西,就接受一个页面。所以您需要更改选择并在忽略页面之前找到匹配项。

ozxc1zmp

ozxc1zmp2#

def search():
    global entry
    Search = entry.get()
    keywords = set(Search.lower().split(","))  # make a set of desired keywords

    for file in files:
        doc=fitz.open(path+'\\'+file)
        file_keywords = set()
        for page in doc:
            text = page.get_text().lower()
            for kw in kw_list:
                if kw in text:
                    file_keywords.add(kw)  # take note this keyword occurred
        # check whether all desired keywords are present in this file
        if keywords <= file_keywords:
            print(f"All keywords in file '{doc.name}'.")

相关问题