使用BS4爬取奥地利医院数据遇无输出及AttributeError问题求助
问题分析与解决方案
一、初始BS4代码无输出的原因及修复
请求被反爬拦截
很多网站会识别非浏览器请求头,Colab默认请求头容易被判定为爬虫。添加模拟浏览器的请求头即可解决:import requests from bs4 import BeautifulSoup 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.klinikguide.at/oesterreichs-kliniken/' response = requests.get(url, headers=headers) # 先检查响应状态码,200代表正常 print(response.status_code) soup = BeautifulSoup(response.text, 'html.parser')如果状态码是403/401,可补充
Accept-Language等请求头,或用session维持连接。数据动态加载
该网站可能用JavaScript渲染内容,BS4只能解析静态HTML。这种情况换用Selenium抓取动态内容(Colab环境适用):# 先在Colab安装依赖 !pip install selenium !apt-get update && !apt-get install -y chromium-chromedriver from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') driver = webdriver.Chrome(options=chrome_options) driver.get('https://www.klinikguide.at/oesterreichs-kliniken/') soup = BeautifulSoup(driver.page_source, 'html.parser') driver.quit()选择器错误
可能你写的BS4选择器(如find/find_all的参数)和页面实际结构不匹配。先打印soup.prettify()查看页面源码,确认目标元素的正确选择器。
二、AttributeError: 'NoneType' object has no attribute 'groupdict'的修复
这个错误是因为你调用正则的groupdict()方法时,匹配结果为None(正则没找到对应内容)。修复方法:
- 检查正则表达式是否和目标文本格式匹配,调整正则规则;
- 调用
groupdict()前先判断匹配结果是否有效:
比如提取医院电话、地址时,部分条目可能缺失对应内容,必须加判断避免报错。import re pattern = re.compile(r'你的正则表达式') match_result = pattern.search(目标文本) if match_result: data = match_result.groupdict() # 处理提取到的数据 else: print("未匹配到内容") # 可设置默认值或跳过当前条目
额外调试建议
- 分步打印中间结果:比如先打印响应文本前500字符,确认是否获取到正确页面;打印正则匹配前的目标文本,验证规则是否适用;
- 查看网站
robots.txt确认爬取权限,避免违反网站规则。
内容的提问来源于stack exchange,提问作者zero
相关产品推荐
相关产品推荐

