如何用BeautifulSoup抓取推文的time标签?
解决推文日期获取返回None的问题
问题原因
- 动态class失效:X(原Twitter)的CSS类名是动态生成的,会频繁变更,你用的
css-901oao r-18jsvk2...这类class很快就会失效,无法定位到正确元素。 - 元素层级错误:你定位的div并不包含
<time>标签,<time>通常在推文的头部区域,和推文内容的div不是同一个层级。
修复方案
方案1:用稳定属性定位推文容器
放弃依赖动态class,改用推文的data-testid="tweet"属性定位每个推文容器,再从中提取<time>标签:
page = driver.page_source soup = BeautifulSoup(page, "html.parser") # 定位所有推文容器 tweets = soup.find_all(attrs={"data-testid": "tweet"}) for tweet in tweets: # 从推文容器中查找time标签 time_tag = tweet.find("time") if time_tag: # 获取显示的日期文本 print(time_tag.get_text(strip=True)) # 获取精确的时间戳(datetime属性) print(time_tag.get("datetime"))
方案2:等待页面完全加载
如果页面未加载完成就获取源码,会导致找不到元素,添加显式等待确保元素加载:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待推文加载完成,最多等待10秒 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, '[data-testid="tweet"] time')) ) page = driver.page_source soup = BeautifulSoup(page, "html.parser") tweets = soup.find_all(attrs={"data-testid": "tweet"}) for tweet in tweets: time_tag = tweet.find("time") if time_tag: print(time_tag.get_text(strip=True), time_tag.get("datetime"))
方案3:直接用Selenium定位time标签
跳过BeautifulSoup,直接用Selenium查找元素,避免页面源码同步问题:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, '[data-testid="tweet"] time')) ) time_tags = driver.find_elements(By.CSS_SELECTOR, '[data-testid="tweet"] time') for tag in time_tags: print(tag.text, tag.get_attribute("datetime"))
注意事项
- X的页面结构会持续更新,若上述方法失效,可打开浏览器开发者工具(F12),重新查看推文和
<time>标签的最新定位属性。 - 频繁爬取可能触发反机制,建议添加合理的请求间隔。
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

