Hướng dẫn invalid date exception python - python ngoại lệ ngày không hợp lệ

Dự án của tôi tương đối thẳng về phía trước. Tôi đang cố gắng tạo một công cụ xào web để lấy một sự kiện ngẫu nhiên từ bất kỳ bài viết Wikipedia nào cho một ngày nhất định. Định dạng của URL là: url = f"https://en.wikipedia.org/wiki/{month}_{day}" trong đó tháng là tên đầy đủ của tháng theo sau là ngày.

Những gì tôi đang cố gắng đạt được:

Điều tôi đang cố gắng đạt được cụ thể ở đây là nếu một ngày không hợp lệ như ngày 31 tháng 6 hoặc ngày 30 tháng 2 là đầu vào, thì hàm dưới dừng lại và trả về Please provide a valid date dưới dạng đầu ra của nó mà không có thông báo lỗi.invalid date such as June 31 or Feb 30 were input, then the function below stops and returns a Please provide a valid date as its output without an error message.

Giải pháp đã cố gắng:

Tôi đã thử điều này với một câu lệnh if ánh xạ một bộ tháng thành một tập hợp ngày nhưng nó khá là wonky, như được hiển thị dưới đây:

import pandas as pd
import numpy as np

import requests
from bs4 import BeautifulSoup

    
month = 'January'
day = '99'
    
url = f"https://en.wikipedia.org/wiki/{month}_{day}"

thirty = [*range(1,31)]
thirty = [str(x) for x in thirty]
thirty_one = [*range(1,32)]
thirty_one = [str(x) for x in thirty_one]
twenty_nine = [*range(1,30)]
twenty_nine = [str(x) for x in twenty_nine]


soup = BeautifulSoup(requests.get(url).content, "html.parser")

def wikiscraper():

    events = []
    
    if (month == set(['April','June','September','November']) and day != set(thirty))| \
    (month == set(['January','March','May','July','August','October','December']) and day != set(thirty_one))| \
    (month == set(['February']) and day != set(twenty_nine)):
        return print("Please provide a valid date")
    
    else:    

        for li in soup.select("h3 + ul > li"):
            if (h2 := li.find_previous("h2")) and (h2.find(id="Events")):
                date, event = li.text.replace("–", "-").split(" - ", maxsplit=1)
                events.append((date, event))
            
        events = pd.DataFrame(events)
        cols = ['year','event']
        events = pd.DataFrame(events)
        events.columns = cols
    
        pd.options.display.max_colwidth = 300
        events['combined'] = 'On this date in the year'+' '+events.year+' '+events.event
        events = events[['combined']]
        return events.sample()

wikiscraper()

mà trở lại

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
 in 
----> 1 wikiscraper()

 in wikiscraper()
     18         cols = ['year','event']
     19         events = pd.DataFrame(events)
---> 20         events.columns = cols
     21 
     22         pd.options.display.max_colwidth = 300

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py in __setattr__(self, name, value)
   5150         try:
   5151             object.__getattribute__(self, name)
-> 5152             return object.__setattr__(self, name, value)
   5153         except AttributeError:
   5154             pass

pandas/_libs/properties.pyx in pandas._libs.properties.AxisProperty.__set__()

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py in _set_axis(self, axis, labels)
    562     def _set_axis(self, axis: int, labels: Index) -> None:
    563         labels = ensure_index(labels)
--> 564         self._mgr.set_axis(axis, labels)
    565         self._clear_item_cache()
    566 

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/internals/managers.py in set_axis(self, axis, new_labels)
    224 
    225         if new_len != old_len:
--> 226             raise ValueError(
    227                 f"Length mismatch: Expected axis has {old_len} elements, new "
    228                 f"values have {new_len} elements"

ValueError: Length mismatch: Expected axis has 0 elements, new values have 2 elements

Tôi cũng đã thử nó với assert hoạt động, nhưng tôi muốn giữ cho nó sạch sẽ mà không có lỗi khẳng định và chỉ có một đầu ra in yêu cầu một ngày hợp lệ. Tôi chắc chắn không phải là một cách "Pythonic", mặc dù được chạy với đầu ra mong muốn là ưu tiên lớn hơn.

Mục tiêu cuối cùng của tôi là chỉ cần có chức năng dừng và Please provide a valid date nếu đầu vào chuỗi không tương thích với ngày thực.

chỉnh sửa. Giải pháp đơn giản

    if (month in set(['April','June','September','November']) and day not in set(thirty))| \
    (month in set(['January','March','May','July','August','October','December']) and day not in set(thirty_one))| \
    (month in set(['February']) and day not in set(twenty_nine)):
        return print("Please provide a valid date")

Chỉ cần sử dụng in và không phải

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
 in 
----> 1 wikiscraper()

 in wikiscraper()
     18         cols = ['year','event']
     19         events = pd.DataFrame(events)
---> 20         events.columns = cols
     21 
     22         pd.options.display.max_colwidth = 300

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py in __setattr__(self, name, value)
   5150         try:
   5151             object.__getattribute__(self, name)
-> 5152             return object.__setattr__(self, name, value)
   5153         except AttributeError:
   5154             pass

pandas/_libs/properties.pyx in pandas._libs.properties.AxisProperty.__set__()

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py in _set_axis(self, axis, labels)
    562     def _set_axis(self, axis: int, labels: Index) -> None:
    563         labels = ensure_index(labels)
--> 564         self._mgr.set_axis(axis, labels)
    565         self._clear_item_cache()
    566 

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/internals/managers.py in set_axis(self, axis, new_labels)
    224 
    225         if new_len != old_len:
--> 226             raise ValueError(
    227                 f"Length mismatch: Expected axis has {old_len} elements, new "
    228                 f"values have {new_len} elements"

ValueError: Length mismatch: Expected axis has 0 elements, new values have 2 elements
0 người dùng Timus để giải cứu với một sai lầm ngu ngốc.