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

使用Selenium Python提取多类名下HTML标签值遇超时异常求助

问题描述

需要从以下HTML结构中提取文本xms:

<div class="ki-kullaniciadi member-info" member-info-memberid="12789" member-info-forumid="2613">
        <a href="/profil/12789">
            <b>xms</b>
        </a>
    </div>

尝试了多种Selenium定位方式(CSS选择器、CLASS_NAME、XPATH等),比如以下代码:

def scrapecomments2(url):
  tic = time.perf_counter()
  wait = WebDriverWait(wd,20)
  wd.get(url)

  data2=[]

  for comment in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.ki-kullaniciadi.member-info b"))):
          data2.append(comment.text)

  toc = time.perf_counter()
  print(data2)
  return data2

但始终抛出TimeoutException:

TimeoutException                          Traceback (most recent call last)
<ipython-input-8-e105fdffd5ff> in <cell line: 1>()
----> 1 scrapev2=scrapecomments2('https://forum.donanimhaber.com/tesla-model-y-kullananlar-kulubu-2023--155488676-1151')

1 frames
/usr/local/lib/python3.10/dist-packages/selenium/webdriver/support/wait.py in until(self, method, message)
    103             if time.monotonic() > end_time:
    104                 break
--> 105         raise TimeoutException(message, screen, stacktrace)
    106 
    107     def until_not(self, method: Callable[[D], T], message: str = "") -> Union[T, Literal[True]]:

TimeoutException: Message: 

用By.TAG_NAME定位<b>标签能获取所有<b>文本,但只需要属于ki-kullaniciadi member-info类的<b>内容。尝试过带contains的XPATH也无效,偶然发现用By.CLASS_NAME定位"icerik b"能成功提取xms,不清楚原因,寻求解答。

原因分析与解决办法

1. 原定位失败的可能原因

  • 动态加载延迟:目标元素可能是页面初始加载后通过JS动态渲染的,presence_of_all_elements_located只等待元素存在,若元素还未完成渲染就会超时。
  • 选择器匹配问题:div.ki-kullaniciadi.member-info b这个CSS选择器可能因为页面存在同名类但结构不同的元素,或者网站反爬机制限制了直接类名定位,导致无法匹配到目标元素。
  • iframe嵌套:如果目标元素在iframe内部,直接用当前页面上下文定位会失败,需要先切换到对应iframe。

2. 为什么By.CLASS_NAME定位"icerik b"能成功

By.CLASS_NAME本身只支持单个类名定位,传入带空格的"icerik b"其实不符合规范(空格会被当成类名的一部分),能生效的原因大概率是:

  • 实际页面中,包含xms的<b>标签或其父元素同时拥有icerik和b类(你提供的HTML片段可能未完全展示实际渲染后的结构)。
  • 网站渲染时动态修改了元素类名,icerik b恰好匹配到了目标元素。

3. 更可靠的定位方案

推荐使用以下几种稳定的定位方式:

方案一:精准XPATH定位

# 直接匹配层级结构:指定类的div -> a标签 -> b标签
wait.until(EC.presence_of_all_elements_located((By.XPATH, "//div[@class='ki-kullaniciadi member-info']/a/b")))

方案二:模糊匹配类名(应对动态类名变化)

# 匹配同时包含两个类名的div下的b标签
wait.until(EC.presence_of_all_elements_located((By.XPATH, "//div[contains(@class,'ki-kullaniciadi') and contains(@class,'member-info')]/a/b")))

方案三:等待元素可见(确保渲染完成)

用visibility_of_all_elements_located代替presence_of_all_elements_located,确保元素已渲染可见:

for comment in wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.ki-kullaniciadi.member-info > a > b"))):
    data2.append(comment.text)

内容的提问来源于stack exchange,提问作者erhan ustaoglu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:42:41