网页爬取Reddit子版块时如何避免'NoneType'无'text'属性错误?
解决Reddit随机子版块获取与访问的问题
问题核心原因
- 请求被拦截 + 动态class不可靠:Reddit会拦截无标识的爬虫请求,且页面元素的class是动态生成的,硬编码class值会导致找不到元素报错。
- URL拼接错误:用子版块的显示标题拼接URL是错误的,标题可能包含空格、特殊字符,且不是子版块的路径标识。
修正后的代码
import requests import webbrowser from bs4 import BeautifulSoup # 模拟浏览器请求头,避免被Reddit拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } while True: # 发送请求并自动跟随重定向到随机子版块 response = requests.get("https://www.reddit.com/r/random", headers=headers) # 从最终URL提取子版块路径与名称 subreddit_id = response.url.split('/r/')[1].split('/')[0] subreddit_name = f"r/{subreddit_id}" # 可选:用BeautifulSoup获取子版块的友好显示标题 soup = BeautifulSoup(response.content, "html.parser") subreddit_display_title = soup.find("h1", class_="_eYtD2XCVieq6emjKBH3m").text print(f"找到子版块:{subreddit_display_title} ({subreddit_name})") print("是否访问该子版块?(Y/N)") ans = input().lower() if ans == "y": # 直接使用重定向后的完整URL,避免拼接错误 webbrowser.open(response.url) break elif ans == "n": print("重新获取随机子版块...") continue else: print("输入错误,程序退出") break
关键改动说明
- 添加请求头:通过
User-Agent模拟浏览器访问,绕过Reddit的爬虫拦截机制。 - 利用重定向URL提取信息:
requests.get会自动跳转到随机子版块的页面,response.url就是该子版块的完整有效链接,从中拆分出子版块ID更可靠,无需依赖易变的页面元素。 - 避免手动拼接URL:直接使用重定向后的完整URL打开浏览器,彻底解决路径错误问题。
- 可选的友好标题获取:使用相对稳定的页面结构(h1标签+通用class)获取子版块的显示名称,提升用户体验。
内容的提问来源于stack exchange,提问作者Trick
相关产品推荐
相关产品推荐

