You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 13:37:45