日期时间时区抓取 Python

Datetime Time Zone Scraping Python

我正在尝试对带有 body、标题和日期列的文章进行抓取和排序。但是,在提取日期时,我 运行 遇到时区错误:

ValueError: time data 'Jun 1, 2022 2:49PM EDT' does not match format '%b %d, %Y %H:%M%p %z'

我的代码如下:

def get_info(url):
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'}
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text)
    news = soup.find('div', attrs={'class': 'body__content'}).text
    headline = soup.find('h1').text
    date = datetime.datetime.strptime(soup.find('time').text, "%b %d, %Y %H:%M%p %z")
    columns = [news, headline, date]
    column_names = ['News','Headline','Date']
    return dict(zip(column_names, columns))

有没有办法用类似的方法获取时区,或者只是整体放弃?

注意 strptime() 中的 %z 用于时区偏移量而不是名称,并且 %Z 仅接受时区的某些值。有关详细信息,请参阅 API docs

最简单的选择是使用 dateparser 模块来解析带有时区名称(例如 EDT)的日期。

import dateparser

s = "Jun 1, 2022 2:49PM EDT"
d =  dateparser.parse(s)
print(d)

输出:

2022-06-01 14:49:00-04:00

许多日期模块(例如 dateutil and pytz)都为“EST”、“PST”等定义了时区偏移量,但“EDT”不太常见。这些模块需要您将时区定义为 UTC-04:00。

import dateutil.parser

s = "Jun 1, 2022 2:49PM EDT"
tzinfos = {"EDT": -14400}
d = dateutil.parser.parse(s, tzinfos=tzinfos)
print(d)

输出:

2022-06-01 14:49:00-04:00

作为@CodeMonkey解决方案的替代方案,您也可以通过pandas尝试:

pd.to_datetime('Jun 1, 2022 2:49PM EDT').tz_localize('US/Eastern')