マークダウンで検索したい

投稿者: | 2023-05-18

目次

chatGPTへ相談

  • 複数のマークダウンファイルがフォルダAに保存されています。あるキーワードを検索したいです。結果はマークダウンファイル名とそのキーワードが含まれる箇所を一覧表示させてください。またクリックするとそのマークダウンファイルの該当箇所が開くようにしてください。
  • 検索結果はHTMLで表示させ、ハイパーリンクにしてください。

回答

結論:サクラエディタで検索したほうが簡単で便利。よって以下は却下。

  • 以下のコードは、指定されたフォルダ内の複数のマークダウンファイルからキーワードを検索し、HTML形式で結果を表示し、ハイパーリンクとして該当箇所が開くようにするものです。
  • このコードでは、BeautifulSoupを使用してHTMLの構造を解析し、キーワードに一致するテキストを検索します。検索結果はHTML形式で生成され、ファイル名はハイパーリンクとして表示されます。ファイルを開くためには、ブラウザで生成されたHTMLファイルを開くか、ファイルパスをクリックしてエクスプローラーやエディタで開くことができます。
  • コードの最後の部分では、検索結果を”検索結果.html”という名前のファイルに保存しています。必要に応じてファイルの保存先やファイル名を変更してください。
import os
import re
from markdown import markdown
from bs4 import BeautifulSoup

def search_keyword_in_folder(folder_path, keyword):
    results = []
    for filename in os.listdir(folder_path):
        if filename.endswith(".md"):
            file_path = os.path.join(folder_path, filename)
            with open(file_path, "r", encoding="utf-8") as file:
                markdown_text = file.read()
                html_content = markdown(markdown_text)
                soup = BeautifulSoup(html_content, "html.parser")
                matches = soup.find_all(text=re.compile(keyword, re.IGNORECASE))
                for match in matches:
                    result = {
                        "filename": filename,
                        "location": str(match),
                        "filepath": file_path
                    }
                    results.append(result)
    return results

def generate_search_results_html(search_results):
    html = "<html><head><title>Search Results</title></head><body>"
    for result in search_results:
        html += f"<p>ファイル名: <a href='file://{result['filepath']}'>{result['filename']}</a></p>"
        html += f"<p>該当箇所: {result['location']}</p>"
        html += "<hr>"
    html += "</body></html>"
    return html

folder_path = "フォルダAのパス"
keyword = "検索キーワード"

search_results = search_keyword_in_folder(folder_path, keyword)
html_content = generate_search_results_html(search_results)

with open("検索結果.html", "w", encoding="utf-8") as file:
    file.write(html_content)