使用Selenium+Beautiful Soup爬取动态网站时遭遇NoneType属性错误的技术求助
解决Beautiful Soup查找元素返回None的AttributeError问题
嘿,刚看到你的问题,这是新手用Beautiful Soup和Selenium时很容易踩的坑——你把类名当成标签名来查找啦!
错误原因解析
你代码里的soup.find('main-line-status-txt')是在找标签名为<main-line-status-txt>的元素,但实际上main-line-status-txt是元素的类名,不是标签名。同样status-up也是类名,不是标签。这就导致soup.find()返回None,后续调用.find()自然触发了AttributeError。
下面给你两种可行的解决方案:
方案一:用Beautiful Soup正确查找类名
Beautiful Soup支持通过class_参数或CSS选择器定位带指定类的元素,修改后的代码如下:
from bs4 import BeautifulSoup from webdriver_manager.microsoft import EdgeChromiumDriverManager from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ec def server_status(): # Preload web page with selenium browser = webdriver.Edge(EdgeChromiumDriverManager().install()) browser.maximize_window() wait = WebDriverWait(browser, 200) url = 'https://www.dualuniverse.game/server-status' browser.get(url) # 改为等待目标元素加载,更精准 wait.until(ec.presence_of_element_located((By.CLASS_NAME, 'main-line-status-txt'))) soup = BeautifulSoup(browser.page_source, 'html.parser') # 先定位带main-line-status-txt类的元素 status_container = soup.find(class_='main-line-status-txt') if status_container: # 再查找容器内带status-up类的元素 status_element = status_container.find(class_='status-up') if status_element: print(status_element.text.strip()) # 打印元素的文本内容 else: print("未找到带status-up类的元素") else: print("未找到带main-line-status-txt类的元素") browser.quit() # 记得关闭浏览器进程 server_status()
方案二:直接用Selenium获取元素(更推荐)
既然你已经在用Selenium等待动态元素加载,完全可以跳过Beautiful Soup,直接用Selenium获取元素内容——这样更可靠,因为Selenium直接和浏览器交互,不需要二次解析页面源码:
from webdriver_manager.microsoft import EdgeChromiumDriverManager from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ec def server_status(): browser = webdriver.Edge(EdgeChromiumDriverManager().install()) browser.maximize_window() wait = WebDriverWait(browser, 200) url = 'https://www.dualuniverse.game/server-status' browser.get(url) try: # 用CSS选择器直接定位目标元素:父类下的子类 status_text = wait.until(ec.visibility_of_element_located( (By.CSS_SELECTOR, '.main-line-status-txt .status-up') )).text.strip() print(status_text) except Exception as e: print(f"获取元素失败:{e}") finally: browser.quit() server_status()
额外小提示
- 你之前等待的是
main-line-status-desc元素,建议改成等待你实际要获取的目标元素,这样等待逻辑更精准。 - 每次用完浏览器后一定要调用
browser.quit(),避免残留浏览器进程占用资源。
内容的提问来源于stack exchange,提问作者Vyz Ejstu
相关产品推荐
相关产品推荐

