使用Beautiful Soup提取CNN新闻标题失败,求解决方案
解决CNN搜索页面标题爬取无输出问题
可能的问题原因
- 请求头缺失:CNN服务器会拦截不带User-Agent的请求,导致返回的页面不包含完整内容。
- 类选择器使用错误:
container__headline __headline是两个独立的CSS类,直接作为字符串传入可能无法正确匹配。 - 页面动态加载:标题内容由JavaScript异步渲染,
requests只能获取静态HTML,无法拿到动态生成的内容。 - 页面结构变更:CNN可能调整了页面布局,标题不再位于指定的div标签中,而是放在h3、h4等标签内。
解决方案代码
静态页面适配(带请求头+正确选择器)
import requests from bs4 import BeautifulSoup url = "https://www.cnn.com/search?q=new&from=0&size=10&page=1&sort=newest&types=all§ion=politics" # 添加模拟浏览器的请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, "html.parser") # 用CSS选择器匹配多类元素 target_headlines = soup.select("div.container__headline.__headline") # 备选:查找常见的h3标题容器 backup_headlines = soup.select("h3.container__headline") if target_headlines: print("抓取到目标标题:") for i, headline in enumerate(target_headlines, 1): print(f"{i}. {headline.get_text(strip=True)}") elif backup_headlines: print("抓取到备选标题(h3标签):") for i, headline in enumerate(backup_headlines, 1): print(f"{i}. {headline.get_text(strip=True)}") else: print("未找到标题,请检查页面最新结构或尝试动态加载方案")
动态页面适配(使用Selenium)
如果页面是JS动态渲染,requests无法获取内容,用Selenium模拟浏览器加载:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import time url = "https://www.cnn.com/search?q=new&from=0&size=10&page=1&sort=newest&types=all§ion=politics" # 初始化Chrome浏览器 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get(url) time.sleep(3) # 等待页面完全加载 # 获取渲染后的页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, "html.parser") # 查找标题元素 target_headlines = soup.select("div.container__headline.__headline") backup_headlines = soup.select("h3.container__headline") if target_headlines: print("抓取到目标标题:") for i, headline in enumerate(target_headlines, 1): print(f"{i}. {headline.get_text(strip=True)}") elif backup_headlines: print("抓取到备选标题(h3标签):") for i, headline in enumerate(backup_headlines, 1): print(f"{i}. {headline.get_text(strip=True)}") else: print("未找到标题,请检查页面元素结构") driver.quit()
额外提示
- 检查页面结构:右键目标标题→检查元素,确认当前标题所在的标签和类名是否正确。
- 反爬应对:如果频繁请求被拦截,可以添加随机延迟、更换User-Agent。
内容的提问来源于stack exchange,提问作者Cflan99
相关产品推荐
相关产品推荐

