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

Python Selenium获取无唯一标识div中财务数据失败的问题咨询

问题:无法匹配含‘FINANSE’的div获取财务数据

我尝试从网页的某个div中提取财务数据,但该div没有唯一ID。于是我用CSS选择器div.card.mb-4抓取了页面中3-4个相关div,遍历检查每个div的文本是否包含‘FINANSE’,若匹配则获取其内部div.card-body的文本作为财务数据;未匹配到则设置为"Finance Data Not Available"。但这个方案无法正常工作,想请教有没有其他解决方法,或者我在代码逻辑/元素定位上忽略了什么问题?

附原代码:

fin_divs = driver.find_elements_by_css_selector('div.card.mb-4')
for div in fin_divs:
    if 'FINANSE' in div.text:
        finances = div.find_element_by_css_selector('div.card-body').text
    else:
        finances = "Finance Data Not Available"

问题分析与解决方法

1. 先修复核心逻辑错误

你的代码有一个致命的逻辑问题:每次遍历到不匹配的div时,都会覆盖之前可能已经找到的正确财务数据。比如第一个div就是目标元素,你已经赋值了正确的finances,但后面的div不匹配时,又会把它改成默认值,最终结果自然不对。

修改思路:先初始化默认值,找到匹配项后立即更新并跳出循环,避免被后续元素覆盖:

# 先设置默认值
finances = "Finance Data Not Available"
fin_divs = driver.find_elements_by_css_selector('div.card.mb-4')

for div in fin_divs:
    # 加上大小写兼容,避免页面文本大小写不一致的问题
    if 'FINANSE' in div.text.strip().upper():
        finances = div.find_element_by_css_selector('div.card-body').text
        break  # 找到目标后直接退出循环,防止被后续元素覆盖

2. 排查元素定位的潜在坑

如果修复逻辑后还是不行,检查以下常见问题:

  • 元素未完全加载:目标div可能是动态渲染的,直接抓取会拿到空列表或空文本。用显式等待确保元素加载完成:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等待10秒,直到所有目标div加载完成
fin_divs = WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div.card.mb-4'))
)

finances = "Finance Data Not Available"
for div in fin_divs:
    if 'FINANSE' in div.text.strip().upper():
        finances = div.find_element_by_css_selector('div.card-body').text
        break
  • 文本匹配的精度问题:页面上的"FINANSE"可能带有空格、特殊字符,或者是小写形式。可以用strip()去除首尾空格,再转大写统一判断:
if 'FINANSE' in div.text.strip().upper():
  • 元素在iframe内:如果目标div嵌套在iframe中,必须先切换到iframe才能定位元素:
# 先找到对应的iframe(根据实际页面调整定位方式)
iframe = driver.find_element(By.CSS_SELECTOR, 'iframe[src*="finance"]')
driver.switch_to.frame(iframe)

# 之后再执行查找div的代码
fin_divs = driver.find_elements_by_css_selector('div.card.mb-4')
# ... 后续逻辑
  • 元素不可见导致文本为空:有些元素虽然存在于DOM中,但被隐藏(比如display: none),此时div.text会返回空字符串。可以尝试获取元素的innerText属性:
div_text = div.get_attribute('innerText')
if 'FINANSE' in div_text.strip().upper():
    finances = div.find_element_by_css_selector('div.card-body').get_attribute('innerText')

3. 更精准的定位方式(跳过遍历)

如果知道目标div的其他特征(比如内部的标题标签),可以直接用XPATH定位,不用遍历所有div:

try:
    # 直接定位包含FINANSE标题的card div
    target_card = driver.find_element(By.XPATH, "//div[contains(@class, 'card mb-4') and .//*[text()='FINANSE']]")
    finances = target_card.find_element(By.CSS_SELECTOR, 'div.card-body').text
except:
    finances = "Finance Data Not Available"

这种方式更高效,也避免了遍历带来的逻辑问题。


内容的提问来源于stack exchange,提问作者Abhishek Rai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:02:39