如何用Python BeautifulSoup从谷歌新闻搜索页提取具体日期?
提取谷歌新闻文章的具体日期(而非相对时间)
嘿,我懂你现在的困扰——你抓取到的是「1 day ago」这类相对时间,但想要的是像「2024. 05. 20」这样的具体年月日格式对吧?
其实谷歌新闻页面里藏着精确的具体日期,只是没直接显示在页面可见文本里。你之前抓取的slp类div是谷歌渲染后的相对时间展示,而真正的精确日期存放在<time>标签的datetime属性中,这个属性存储了ISO格式的标准时间,我们可以直接提取它来转换成想要的格式。
另外要注意,谷歌有反爬机制,直接用requests.get可能会被拦截,所以最好加个浏览器的User-Agent头模拟正常访问。
下面是修改后的代码,我会一步步给你解释:
from bs4 import BeautifulSoup import requests from datetime import datetime article_link = "https://www.google.com/search?q=citi+group&tbm=nws&ei=u9_1WsetC67l5gKRt7qYBA&start=0&sa=N&biw=1600&bih=794&dpr=1" # 模拟浏览器请求头,避免被反爬拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36' } page = requests.get(article_link, headers=headers) soup = BeautifulSoup(page.content, 'html.parser') # 遍历每个新闻条目容器(谷歌的类名可能会更新,若失效可通过浏览器开发者工具重新定位) for news_item in soup.find_all('div', class_='Gx5Zad fP1Qef xpd EtOod pkphOe'): # 找到条目内的time标签 time_element = news_item.find('time') if time_element: # 提取datetime属性里的ISO格式时间 iso_time = time_element['datetime'] # 转换为你想要的「YYYY. M. D」格式 # 处理Z后缀,转换成datetime对象后格式化 formatted_date = datetime.fromisoformat(iso_time.replace('Z', '+00:00')).strftime('%Y. %m. %d') print(formatted_date)
关键说明:
- 为什么不直接转换相对时间? 比如把「1 day ago」转换成今天减一天的日期,这种方法误差很大:谷歌的相对时间基于它的服务器时间,和你的本地时间可能有偏差,而且遇到「2 weeks ago」这类模糊时间也没法精确转换。直接用
datetime属性的精确时间是最靠谱的方案。 - 类名更新问题:谷歌的页面结构偶尔会调整,如果上面的容器类名失效了,你可以打开浏览器开发者工具(F12),找到新闻条目的外层div,查看它的最新类名,替换掉代码里的
class_参数就行。
内容的提问来源于stack exchange,提问作者hard1009
相关产品推荐
相关产品推荐

