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
相关产品推荐
相关产品推荐

