日期时间时区抓取 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')
我正在尝试对带有 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')