BeautifulSoup如何从CNN印尼站新冠搜索结果页提取所有文章链接?
问题分析
- 变量名错误:代码中将a标签查找结果赋值给了
a_cont变量,但后续取href属性时误用了未定义的a变量;同时判断条件使用了完全未定义的url变量,逻辑无法正常执行。 - DOM选择器错误:嵌套查找层级过于冗余,且多个类名和目标页面实际DOM结构不匹配,导致始终找不到对应的文章元素,最终返回空列表。
- 缺少请求头伪装:站点会校验请求的User-Agent,无合法UA的请求可能被拦截,返回异常页面导致解析失败。
- 缺少请求状态校验:未判断请求返回状态码,若请求本身失败(如403、500错误),直接解析响应内容也无法得到有效结果。
修复后可运行代码
import requests from bs4 import BeautifulSoup as bs links = [] # 配置请求头伪装成浏览器 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("https://www.cnnindonesia.com/search?query=covid", headers=headers) # 先校验请求是否成功 if response.status_code == 200: soup = bs(response.text, 'html.parser') # 直接定位所有搜索结果的article标签,避免冗余嵌套查找带来的不稳定问题 article_list = soup.find_all('article') for article in article_list: a_tag = article.find('a', href=True) if a_tag: links.append(a_tag['href']) print(links)
补充说明
- 如果解析结果仍为空,可以将解析器替换为容错率更高的
lxml,替换方式为:soup = bs(response.text, 'lxml'),使用前需执行pip install lxml安装对应依赖。 - 该站点搜索结果为分页加载,上述代码仅能获取第一页的文章链接,如需爬取全量数据需要构造分页参数请求后续页面。
内容的提问来源于stack exchange,提问作者MrX
相关产品推荐
相关产品推荐

