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

使用Selenium抓取Indeed网页时匹配指定ID/Class获取文本失败如何解决?

问题根因

  • 异常捕获逻辑错误:你嵌套的try-except结构中,当vjs-content、vjs-desc的捕获抛出异常后,执行完对应except块里的逻辑就会直接break,后面匹配jobDescriptionText和对应class的代码完全不会被执行,这是你抓不到目标结构内容的核心原因。
  • 方法名拼写错误:Selenium没有find_element_by_class方法,正确的方法名是find_element_by_class_name,这个调用本身就会抛出异常。
  • 隐式等待使用错误:implicitly_wait是全局生效的设置,不需要每次调用前重复声明,且隐式等待只能判断元素是否存在DOM中,无法判断元素是否渲染完成可读取文本,容易拿到空值。
  • 重复点击逻辑冗余:每次捕获异常后重复点击职位卡片,可能触发页面跳转或弹窗,反而导致元素定位失败。

修正方案

优化后的代码逻辑

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from time import sleep
from random import randint
from bs4 import BeautifulSoup

# 全局只需要设置一次隐式等待
driver.implicitly_wait(7)
# 提前定义所有要匹配的定位器,按优先级排序
locators = [
    (By.ID, 'vjs-content'),
    (By.ID, 'vjs-desc'),
    (By.ID, 'jobDescriptionText'),
    (By.CLASS_NAME, 'jobsearch-jobDescriptionText')
]

try:
    postings = driver.find_elements(By.CLASS_NAME, 'result')
except:
    print('Error in retrieving postings')

counts = 0 
rate = []

for job in postings:
    try:
        result_html = job.get_attribute('innerHTML')
        soup = BeautifulSoup(result_html, 'html.parser')
    except:
        print('Error in retreiving job from postings')
        continue
    
    sleep(randint(10,15))
    try:
        # 仅点击一次职位卡片
        job.click()
        description0 = ""
        # 遍历所有定位器,找到第一个存在的元素
        for locator in locators:
            try:
                # 用显式等待确认元素可见后再取文本
                element = WebDriverWait(driver, 5).until(
                    EC.visibility_of_element_located(locator)
                )
                description0 = element.text
                counts += 1
                break
            except:
                continue
        if not description0:
            print("No valid description found for this listing")
    except:
        print("Error in retreiving description for listing")
        continue

额外适配场景

如果还是拿不到内容,可额外检查两个场景:

  • 职位描述是否被放在iframe中,如果是需要先调用driver.switch_to.frame()切入iframe后再定位元素
  • 检查是否有反爬机制触发了人机验证,验证通过后再执行元素定位

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:45:03