如何使用BeautifulSoup从指定URL提取网页列表中的日期等目标内容?
香港教育局新闻稿日期字段提取方案
你要爬的页面里,每条新闻的所有信息都包裹在class="card card-body mb-3"的div容器中,每个容器内第一列固定存放发布日期,第二列就是你已经提取到的标题<a>标签。以下是两种实现思路:
方案1:按单条新闻容器遍历(推荐,无数据错位风险)
这种方式直接以每条新闻的父容器为单位提取所有字段,不会出现日期和标题对应不上的问题,比单独遍历a标签更可靠:
- 第一步用
find_all定位所有新闻父容器 - 对每个父容器分别提取日期、标题、链接三个字段
- 把结果存储为字典列表后可直接转pandas DataFrame
示例代码:
from bs4 import BeautifulSoup import requests import pandas as pd # 请求页面 url = "https://www.edb.gov.hk/en/about-edb/press/press-releases/index.html" response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") news_list = [] # 遍历所有新闻条目容器 for item in soup.find_all("div", class_="card card-body mb-3"): # 提取日期 release_date = item.find("div", class_="col-auto pe-0 text-nowrap").get_text(strip=True) # 提取标题和链接 title_tag = item.find("a", href=True) title = title_tag.get_text(strip=True) # 拼接完整链接 full_url = f"https://www.edb.gov.hk{title_tag['href']}" if title_tag["href"].startswith("/") else title_tag["href"] # 加入结果列表 news_list.append({ "release_date": release_date, "title": title, "url": full_url }) # 转pandas DataFrame df = pd.DataFrame(news_list) # 可按需把日期转成标准时间格式 df["release_date"] = pd.to_datetime(df["release_date"], format="%d.%m.%Y") print(df.head())
方案2:使用:nth-of-type选择器匹配日期
如果你不想修改之前单独遍历a标签的逻辑,可以用css选择器直接批量提取所有日期节点,和你已有的标题、链接列表按索引一一对应:
- 日期的css选择器可以写为
div.card.card-body.mb-3 > div.row > div:nth-of-type(1),含义是每个新闻容器下的行里第一个div就是日期字段 - 批量提取日期的代码:
date_list = [d.get_text(strip=True) for d in soup.select("div.card.card-body.mb-3 > div.row > div:nth-of-type(1)")]
- 你之前提取到的标题列表、链接列表和
date_list长度完全一致,按相同索引配对即可。
注意:优先选方案1,若页面后续有结构调整(比如插入了广告位),方案2的索引配对可能出现错位。
内容的提问来源于stack exchange,提问作者Jamo T
相关产品推荐
相关产品推荐

