求助:使用BeautifulSoup获取页面Timestamp返回NaN问题
问题分析
你遇到的核心问题是:页面中cell-item的data-start/data-end属性是前端JavaScript动态计算并注入的,初始HTML里这些值默认是NaN,只有当页面加载完成、JS执行完毕后才会被替换成真实时间戳。你的代码存在两个关键问题:
requests请求的headers格式错误,导致服务器可能返回非预期内容- 即便尝试Selenium,也没有等待JS完成渲染就获取元素
解决方案
方案1:使用Selenium等待JS渲染完成
修正代码,确保等待页面完全加载,直到data-start不再是NaN:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化Chrome浏览器(需确保chromedriver版本与浏览器匹配) driver = webdriver.Chrome() driver.get("https://www.claro.com.br/tv-por-assinatura/programacao/grade") # 等待元素的data-start属性被正确填充(最多等待10秒) wait = WebDriverWait(driver, 10) cells = wait.until( EC.presence_of_all_elements_located( (By.CSS_SELECTOR, 'div.cell-item[data-start!="NaN"]') ) ) # 提取目标数据 for cell in cells: start_ts = cell.get_attribute('data-start') end_ts = cell.get_attribute('data-end') print(f"Start: {start_ts}, End: {end_ts}") driver.quit()
方案2:直接调用后端API(更高效)
打开浏览器开发者工具的Network面板,观察XHR请求,会发现页面实际通过API获取节目数据。找到对应的接口后,可直接用requests请求,无需渲染页面:
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' } # 替换为实际抓取到的API接口(需自行在开发者工具中确认) api_url = "https://www.claro.com.br/api/tv/programacao/grade" response = requests.get(api_url, headers=headers) program_data = response.json() # 从返回的JSON中提取时间戳信息 for item in program_data.get('programs', []): start_ts = item.get('startTimestamp') end_ts = item.get('endTimestamp') print(f"Start: {start_ts}, End: {end_ts}")
额外注意事项
- 确保
User-Agent与当前浏览器版本匹配,避免被服务器拦截 - 部分API可能需要携带特定Cookie或请求头,可通过开发者工具复制完整请求头
- 使用Selenium时,必须保证浏览器驱动版本与浏览器版本完全对应
内容的提问来源于stack exchange,提问作者CondeGuerreiro
相关产品推荐
相关产品推荐

