为何使用BeautifulSoup无法将网站上的林肯名言全部抓取到列表中?
抓取亚伯拉罕·林肯名言失败的原因及解决方法
你遇到的核心问题是选择器匹配错误,同时缺少必要的请求头可能导致页面内容未正确加载,以下是具体分析和修复方案:
问题分析
- 原代码使用的
style_="display: flex;justify-content: space-between"选择器完全不匹配目标页面的名言元素,BrainyQuote的名言内容并未使用该样式的容器。 - 未设置请求头标识,部分网站会对无标识的爬虫请求返回简化或空内容,导致BeautifulSoup无法解析到目标元素。
正确的页面结构与选择器
查看目标页面HTML结构可知:
- 每条名言包裹在带有
bqQt类的div标签中 - 名言文本本身位于该
div下的a标签内
修复后的代码
from bs4 import BeautifulSoup import requests # 添加请求头模拟浏览器访问,避免被反爬拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } url = 'https://www.brainyquote.com/authors/abraham-lincoln-quotes' req = requests.get(url, headers=headers, timeout=1000) req.raise_for_status() # 检查请求是否成功,避免解析错误内容 soup = BeautifulSoup(req.text, "html.parser") # 精准定位所有名言容器 quote_containers = soup.find_all('div', class_='bqQt') # 提取并清洗名言文本 lincoln_quotes = [container.find('a').text.strip() for container in quote_containers if container.find('a')] print(lincoln_quotes)
补充说明
User-Agent请求头用于模拟正常浏览器访问,避免被网站识别为爬虫- 使用
class_='bqQt'作为选择器,能精准定位到名言的容器元素 - 列表推导式中加入判断,过滤掉可能存在的无效元素,确保结果纯净
内容的提问来源于stack exchange,提问作者Rebel
相关产品推荐
相关产品推荐

