爬取Hacker News出现AttributeError:'NoneType'无get_text属性
出现AttributeError: 'NoneType' object has no attribute 'get_text'的核心原因是你使用的元素选择器没有匹配到目标内容,返回了None,调用get_text()自然会报错。和导师运行结果不同,大概率是以下几个差异导致:
页面结构或内容差异:Hacker News会根据访问者的IP地区、设备类型返回不同的页面结构,比如你和导师的IP归属地不同,网站渲染的DOM元素类名、层级发生了变化,导致你的选择器匹配不到标题元素。可以先打印
soup.prettify()查看实际解析后的页面结构,对比导师那边的元素定位方式是否一致。请求头缺失触发反爬拦截:导师的请求可能携带了模拟浏览器的请求头,而你的代码直接用
requests.get(url)发起请求,被网站识别为非浏览器请求,返回了反爬页面(比如验证码页、空白页),自然找不到目标标题。可以给请求添加完整的请求头,示例:
headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } resp = requests.get('https://news.ycombinator.com/', headers=headers)
网络环境差异:你和导师的网络环境不同,比如你使用了VPN、代理,或者网络波动导致请求返回的内容不完整、加载失败。可以先打印
resp.status_code确认请求是否成功(正常状态码为200),再打印resp.text查看返回的是不是正常的Hacker News页面内容。BeautifulSoup解析器不一致:你们初始化BeautifulSoup时用了不同的解析器,比如你用
html.parser,导师用lxml。不同解析器对不规范HTML的处理逻辑有差异,可能导致元素定位结果不同。确保解析器一致,比如统一使用:
from bs4 import BeautifulSoup soup = BeautifulSoup(resp.text, 'lxml')
内容的提问来源于stack exchange,提问作者Clay

