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

