以下に、BeautifulSoup (bs4) を使用してウェブスクレイピングを行い、開始日と終了日を入力して結果を表示し、XMLファイルに保存するサンプルコードを示します。

このコードでは、Tkinterを使用してGUIを作成し、日付ピッカーで開始日と終了日を選択できます。検索ボタンを押すと、指定された日付範囲に基づいてデータをスクレイピングし、結果を表示およびXMLファイルに保存します。

import tkinter as tk
from tkinter import messagebox
from tkcalendar import DateEntry
import requests
from bs4 import BeautifulSoup
import xml.etree.ElementTree as ET
from datetime import datetime

def scrape_data(start_date, end_date):
    # サンプルのウェブサイトからデータをスクレイピング
    # 実際のウェブサイトにアクセスする場合は、適切なURLとパースロジックを記述してください
    url = '<https://example.com/data>'
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    # データを抽出(ここではサンプルとして静的データを使用)
    data = [
        {'date': '2023-10-01', 'value': 'データ1'},
        {'date': '2023-10-05', 'value': 'データ2'},
        {'date': '2023-10-10', 'value': 'データ3'},
        {'date': '2023-10-15', 'value': 'データ4'},
        {'date': '2023-10-20', 'value': 'データ5'},
    ]

    # 日付範囲でデータをフィルタリング
    filtered_data = []
    for item in data:
        item_date = datetime.strptime(item['date'], '%Y-%m-%d').date()
        if start_date <= item_date <= end_date:
            filtered_data.append(item)

    return filtered_data

def save_to_xml(data, filename='output.xml'):
    root = ET.Element('Data')
    for item in data:
        entry = ET.SubElement(root, 'Entry')
        date_elem = ET.SubElement(entry, 'Date')
        date_elem.text = item['date']
        value_elem = ET.SubElement(entry, 'Value')
        value_elem.text = item['value']

    tree = ET.ElementTree(root)
    tree.write(filename, encoding='utf-8', xml_declaration=True)

def search():
    start_date = cal_start.get_date()
    end_date = cal_end.get_date()
    if start_date > end_date:
        messagebox.showerror("エラー", "開始日は終了日より前に設定してください。")
        return

    results = scrape_data(start_date, end_date)
    if results:
        output_text.delete('1.0', tk.END)
        for item in results:
            output_text.insert(tk.END, f"日付: {item['date']}, 値: {item['value']}\\n")
        save_to_xml(results)
        messagebox.showinfo("成功", "結果をoutput.xmlに保存しました。")
    else:
        messagebox.showinfo("データなし", "選択された日付範囲にデータがありません。")

# GUIのセットアップ
root = tk.Tk()
root.title("日付範囲スクレイパー")

tk.Label(root, text="開始日:").grid(row=0, column=0, padx=10, pady=10)
cal_start = DateEntry(root, width=12, background='darkblue',
                foreground='white', borderwidth=2)
cal_start.grid(row=0, column=1, padx=10, pady=10)

tk.Label(root, text="終了日:").grid(row=1, column=0, padx=10, pady=10)
cal_end = DateEntry(root, width=12, background='darkblue',
                foreground='white', borderwidth=2)
cal_end.grid(row=1, column=1, padx=10, pady=10)

tk.Button(root, text="検索", command=search).grid(row=2, column=0, columnspan=2, pady=10)

output_text = tk.Text(root, height=10, width=50)
output_text.grid(row=3, column=0, columnspan=2, padx=10, pady=10)

root.mainloop()

必要なパッケージのインストール

このコードを実行する前に、以下のパッケージをインストールしてください。

pip install tkcalendar requests beautifulsoup4

コードの説明

  1. GUIの作成: Tkinterを使用して、開始日と終了日を選択するためのデータピッカーと検索ボタンを作成します。
  2. スクレイピング関数 (scrape_data): 指定された日付範囲に基づいてデータを取得します。ここではサンプルデータを使用していますが、実際にはrequestsBeautifulSoupを使用してウェブサイトからデータを取得します。
  3. XMLへの保存 (save_to_xml): 取得したデータをXML形式でファイルに保存します。
  4. 検索ボタンの動作 (search): ボタンが押されたときに、日付の検証、データの取得、結果の表示、XMLファイルへの保存を行います。

注意事項

実行方法

  1. 上記のコードをPythonファイル(例: scraper.py)にコピーします。

  2. 必要なパッケージをインストールします。

  3. ターミナルまたはコマンドプロンプトで以下を実行します。

    python scraper.py