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"//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"//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.