如何从同class名的网页元素中提取指定格式的日期?
提取目标日期的两种实现方案
问题背景
爬取网站时,存在多个class为rr的div元素,数量随页面变化。需提取格式如24 January 2020的日期,该日期位于<b>标签内,当前目标日期在最后一个rr类div中。
解决方案
方法一:直接定位最后一个目标元素
利用列表索引获取最后一个rr类div,再提取其中<b>标签的文本内容:
# 获取最后一个rr类div元素 last_rr_div = items_list[-1] # 提取b标签内的日期文本 target_date = last_rr_div.find('b').text.strip() print(target_date) # 输出:24 January 2020
方法二:正则匹配日期格式(更鲁棒)
如果后续页面结构调整,日期位置发生变化,正则匹配能确保精准提取符合格式的日期:
# 定义匹配目标日期格式的正则表达式 date_pattern = re.compile(r'\d{1,2} [A-Za-z]+ \d{4}') target_date = None # 遍历所有rr类div,查找符合格式的日期 for div in items_list: for b_tag in div.find_all('b'): text = b_tag.text.strip() # 完全匹配日期格式 if date_pattern.fullmatch(text): target_date = text break if target_date: break print(target_date) # 输出:24 January 2020
完整可运行代码
import pandas as pd import numpy as np import requests from bs4 import BeautifulSoup import re from user_agent import generate_user_agent import time import os # 补充os模块导入,适配generate_user_agent参数 my_user_agent = generate_user_agent(os=('mac', 'linux')) headers = { "Accept": "*/*", "user-agent": my_user_agent } source = 'https://coronavirus-graph.ru/kanada' req = requests.get(source, headers=headers) html = req.content soup = BeautifulSoup(html, 'lxml') items_list = soup.find_all('div', class_='rr') # 方法一执行 last_rr_div = items_list[-1] target_date_1 = last_rr_div.find('b').text.strip() print("方法一结果:", target_date_1) # 方法二执行 date_pattern = re.compile(r'\d{1,2} [A-Za-z]+ \d{4}') target_date_2 = None for div in items_list: for b_tag in div.find_all('b'): text = b_tag.text.strip() if date_pattern.fullmatch(text): target_date_2 = text break if target_date_2: break print("方法二结果:", target_date_2)
方案对比
- 方法一:代码简洁,依赖当前页面结构,若后续页面调整日期位置则失效。
- 方法二:通过格式匹配定位日期,不受元素位置影响,适应性更强,适合长期使用。
内容的提问来源于stack exchange,提问作者kostya ivanov
相关产品推荐
相关产品推荐

