使用Python爬取纽约时报时找不到目标HTML日期标签该如何解决?
问题原因
- 请求头缺失触发反爬拦截:纽约时报会识别无正常浏览器标识的爬虫请求,返回简化版页面,不会包含目标日期元素。你直接调用
requests.get()未携带User-Agent,被站点识别为爬虫,拿到的返回内容和普通用户浏览器看到的不一致。 - 日期元素为客户端动态渲染内容:你要匹配的
data-testid="todays-date"属性的span标签是页面加载完成后由JS动态生成的,requests只能获取初始静态HTML,不会执行页面JS,所以初始源码里根本不存在该元素,自然匹配结果为空。
解决办法
方案1:补全请求头+提取静态页面内置日期(最简单,无需JS渲染)
纽约时报的静态HTML内置了meta标签存储当日日期,稳定性远高于匹配动态元素,修改后代码如下:
from bs4 import BeautifulSoup import requests link = "https://www.nytimes.com/" # 补全请求头模拟正常浏览器访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } response = requests.get(link, headers=headers) soup = BeautifulSoup(response.text, "html.parser") # 提取静态meta标签中的日期 date_meta = soup.find("meta", property="article:published_time") if date_meta: # 输出格式为YYYY-MM-DD的日期 print(date_meta.get("content").split("T")[0])
方案2:使用支持JS渲染的工具获取动态元素
如果必须匹配该动态生成的span标签,可以用Selenium、Playwright这类模拟浏览器运行的工具,自动执行JS加载完整页面后再匹配元素,Selenium示例代码如下:
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--headless=new") # 无头模式不弹出浏览器窗口 chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.nytimes.com/") soup = BeautifulSoup(driver.page_source, "html.parser") time = soup.find_all("span", {"data-testid": "todays-date"}) print(time) driver.quit()
内容的提问来源于stack exchange,提问作者lalala
相关产品推荐
相关产品推荐

