如何用BeautifulSoup获取YouTube视频的datetime格式发布时间?
搞定YouTube发布时间转datetime格式的问题
嘿,我来帮你解决这个爬虫里的时间转换问题!你现在拿到的是YouTube界面显示的带前缀的文本,我们有两种靠谱的方式把它转成标准的YYYY-MM-DD HH:MM:SS格式,甚至能拿到更精确的时间哦。
优先推荐:直接抓页面里的标准时间属性
其实YouTube的watch-time-text元素里面藏着一个<time>标签,它的datetime属性已经是ISO标准的时间格式(比如2020-02-08T14:30:00Z),直接取这个属性比解析文本靠谱多了,完全不用担心界面显示格式变了导致解析失败。
修改你的代码试试这个:
from datetime import datetime # 先找到watch-time-text元素,再定位里面的time标签 time_tag = video_soup.find("strong", class_="watch-time-text").find("time") if time_tag and "datetime" in time_tag.attrs: # 拿到ISO格式的时间字符串,处理下时区兼容问题 iso_time = time_tag["datetime"].replace("Z", "+00:00") # 转成datetime对象 publish_dt = datetime.fromisoformat(iso_time) # 转成你要的YYYY-MM-DD HH:MM:SS格式字符串 video_obj["date_published"] = publish_dt.strftime("%Y-%m-%d %H:%M:%S") else: # 如果找不到time标签,就用文本解析当备用方案 raw_text = video_soup.find("strong", class_="watch-time-text").text # 把"Published on "前缀去掉,拿到纯日期字符串 clean_date_str = raw_text.replace("Published on ", "").strip() # 解析成datetime对象(这里只有日期,时间默认是00:00:00) publish_dt = datetime.strptime(clean_date_str, "%b %d, %Y") video_obj["date_published"] = publish_dt.strftime("%Y-%m-%d %H:%M:%S") return video_obj["date_published"]
备用方案:仅解析界面显示的文本
要是哪天页面结构变了,找不到<time>标签,就用文本解析的方式救急:
- 先把文本里的"Published on "前缀删掉,得到像
Feb 8, 2020这样的纯日期字符串 - 用
datetime.strptime()按照对应的格式解析:%b对应月份缩写(比如Feb),%d对应日期,%Y对应4位年份 - 解析后用
strftime()转成你要的格式,因为原文本没显示时间,所以时间部分会是00:00:00
代码示例:
from datetime import datetime raw_time_text = video_soup.find("strong", class_="watch-time-text").text # 清理文本,提取核心日期部分 clean_date = raw_time_text.replace("Published on ", "").strip() # 解析为datetime对象 publish_datetime = datetime.strptime(clean_date, "%b %d, %Y") # 转换为目标格式的字符串 video_obj["date_published"] = publish_datetime.strftime("%Y-%m-%d %H:%M:%S") return video_obj["date_published"]
小提醒
不同地区的YouTube界面可能显示不同的日期格式(比如有的地方是8 Feb 2020),这时候抓<time>标签的属性就稳多了,不受语言和地区影响。要是你需要的是datetime对象而不是字符串,直接返回publish_dt就行,不用调用strftime()。
内容的提问来源于stack exchange,提问作者Proteeti Prova
相关产品推荐
相关产品推荐

