如何从新闻页面抓取发布日期?现有标题爬虫需扩展功能
解决新闻爬虫提取发布日期的问题
首先,你需要调整爬取逻辑:不要直接遍历<h2>标签,而是先定位单条新闻的容器元素,再从容器内分别提取标题和发布日期——因为标题和日期属于同一条新闻的关联内容,它们的父容器是统一的。
以New Scientist的太空板块列表页为例,页面里每条新闻都被包裹在<article>标签(带有c-card类)中,发布日期则在<time>标签里(通常带有datetime属性存储标准日期格式,也可以提取标签内的文本)。
修改后的代码如下:
import requests from bs4 import BeautifulSoup as bs # 改为存储字典,每条新闻存标题和日期 news = [] url = 1 while url <= 100: # 这里改成<=100更直观,避免url=100时跳出循环漏爬 website = f"https://www.newscientist.com/subject/space/page/{url}" r = requests.get( website, headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0", "Referer": website } ) soup = bs(r.text, 'html.parser') # 定位每条新闻的容器 news_containers = soup.find_all("article", class_="c-card") for container in news_containers: # 提取标题 title = container.find("h2").get_text(strip=True) # 提取发布日期:优先取datetime属性的标准格式,或者取文本 date_tag = container.find("time") if date_tag: # 两种方式选一个:取datetime属性(格式如2024-05-20) publish_date = date_tag.get("datetime", "") # 或者取标签内的文本(格式如May 20, 2024) # publish_date = date_tag.get_text(strip=True) else: publish_date = "无日期" news.append({"title": title, "publish_date": publish_date}) url += 1 # 别忘了页码自增,否则会死循环! # 打印测试前几条 for item in news[:5]: print(f"标题:{item['title']}\n日期:{item['publish_date']}\n")
关键修改点说明:
- 将
news改为存储字典,同时保存标题和日期信息,方便后续处理。 - 先抓取新闻容器而非单独的标题标签,确保标题和日期对应同一条新闻。
- 处理日期时,优先使用
<time>标签的datetime属性,这个属性的格式更标准、易解析;如果需要可读性更强的文本格式,改用get_text()。 - 修复了原代码的循环逻辑:原代码
while url != 100会在url=100时直接跳出,导致第100页没爬取,改成while url <=100更合理,同时加上url +=1避免死循环(原代码里漏掉了页码自增,这会导致无限循环爬第1页)。
内容的提问来源于stack exchange,提问作者user18355160
相关产品推荐
相关产品推荐

