Webscraper新增采集标签后获取href报NoneType下标错误如何解决
错误根因
你遇到的报错是因为采集advokat标签的页面时,部分搜索结果条目不存在class="link-body"的<a>元素。BeautifulSoup的find()方法匹配不到对应元素时会返回None,直接对None执行['href']下标取值就触发了TypeError: 'NoneType' object is not subscriptable。
之前只采集bygg标签没有报错,是因为该分类下所有条目都存在该元素,新增的advokat分类存在缺失该元素的特殊条目。
修复方案
你可以根据需求选择以下两种修复逻辑:
方案1:缺失时填充默认值,保留所有条目
适合允许部分条目的nummer字段留空的场景,仅需修改nummer字段的取值逻辑即可:
# 原代码行 'nummer': item.find('a', {'class': 'link-body'})['href'], # 修改为以下两行 nummer_elem = item.find('a', {'class': 'link-body'}) 'nummer': nummer_elem['href'] if nummer_elem else '',
方案2:跳过核心字段缺失的无效条目
如果你只需要保留nummer字段完整的有效条目,可以在组装数据前加校验,跳过不符合要求的条目,同时也能避免其他字段缺失引发的同类报错:
def getQuestions(tag, page): url = f'https://www.merinfo.se/search?d=c&ap=1&emp=0%3A20&rev=0%3A100&who={tag}&bf=1&page={page}' r = requests.get(url, headers=headers) # 新增请求状态校验,避免请求失败时解析报错 if r.status_code != 200: return soup = BeautifulSoup(r.text, 'html.parser') questions = soup.find_all('div', {'class': 'box-white p-0 mb-4'}) for item in questions: # 提前提取所有元素做校验 title_elem = item.find('a', {'class': 'link-primary'}) nummer_elem = item.find('a', {'class': 'link-body'}) addr_elem = item.find('address', {'class': 'mt-2 mb-0'}) reg_elem = item.find('div', {'class': 'col text-center'}) # 任意核心字段缺失就跳过当前条目 if not all([title_elem, nummer_elem, addr_elem, reg_elem]): continue question = { 'tag': tag, 'title': title_elem.text.strip(), 'link': title_elem['href'], 'nummer': nummer_elem['href'], 'address': addr_elem.text.strip(), 'RegÅr': reg_elem.text.strip(), } questionlist.append(question) return
额外优化建议
- 可在每次请求后添加1-2秒的延迟,避免请求频率过高被站点封禁:导入
time模块后,在r = requests.get(url, headers=headers)后添加time.sleep(1) - 导出Excel时可以指定
index=False,避免生成多余的序号列:df.to_excel('merinfo skrapare för bygg.xlsx', index=False)
内容的提问来源于stack exchange,提问作者CavTGpunk
相关产品推荐
相关产品推荐

