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

Selenium获取空索引值、代码运行输出null值问题求助

问题原因

你碰到的空列表、打印null问题由以下几个直接原因导致:

  • 时序逻辑错误:触发搜索后没有等待搜索结果渲染,立刻执行元素查找,此时DOM树里还没有生成搜索结果节点,find_elements直接返回空列表[],遍历逻辑完全不执行,最终打印的结果自然是空值。
  • 选择器兼容性差:所有class匹配都用了全值精确匹配,LinkedIn前端class是动态拼接生成的,版本迭代后class属性会追加随机后缀,写死@class='xxx'、[class='xxx']的写法很容易完全匹配不到元素。
  • 等待条件不合理:你用的presence_of_element_located只判断节点存在于DOM中,不保证节点可见、文本内容已渲染,此时读取.text属性拿到的就是空值/null。
  • 隐性路径bug:Windows本地路径字符串没有加r原始符前缀,路径里的\会被Python识别为转义字符,存在驱动加载失败的隐患。
修复方案
  • 所有交互元素的等待条件替换为visibility_of_element_located,确保元素可见、文本渲染完成后再做操作。
  • 搜索触发后增加显式等待,等搜索结果列表全部加载可见后再执行遍历,不要立刻查找元素。
  • 元素定位时用contains做class模糊匹配,CSS选择器用.语法匹配class,不要硬编码全量class值,适配LinkedIn动态class规则。
  • 所有Windows本地路径加r前缀,避免转义字符导致的路径错误。
  • 增加异常捕获,跳过搜索结果里的广告、推荐卡片等非用户条目,避免单条元素定位失败中断整个脚本。
修复后可运行代码
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
import time

options = Options()
options.binary_location = r'C:\Program Files\Google\Chrome Beta\Application\chrome.exe'
# 路径加r前缀规避转义问题
s = Service(r'C:\Program Files\chromedriver.exe')
driver = webdriver.Chrome(options=options, service=s)
driver.maximize_window()

try:
    driver.get('https://www.linkedin.com/login?')
    # 等待登录表单可见后操作
    username = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "username")))
    password = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "password")))
    
    username.clear()
    password.clear()
    username.send_keys('ndy.andupa@gmail.com')
    password.send_keys('*******')
    
    # 点击登录后等待首页加载
    WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//button[@type='submit']"))).click()
    
    # 等待搜索框加载完成后输入关键词
    search_box = WebDriverWait(driver, 15).until(
        EC.visibility_of_element_located((By.XPATH, "//input[contains(@placeholder, 'Search')]"))
    )
    search_box.clear()
    search_box.send_keys('software engineering manager')
    time.sleep(0.5)
    search_box.send_keys(Keys.RETURN)
    
    # 等待搜索结果全部加载
    profile_items = WebDriverWait(driver, 15).until(
        EC.visibility_of_all_elements_located((By.XPATH, "//li[contains(@class, 'reusable-search__result-container')]"))
    )
    
    pr_list = []
    for item in profile_items:
        try:
            # 模糊匹配用户名节点
            name_ele = WebDriverWait(item, 3).until(
                EC.visibility_of_element_located((By.CSS_SELECTOR, "a.app-aware-link span span[aria-hidden='true']"))
            )
            name_text = name_ele.text.strip()
            if name_text:
                print(name_text)
                pr_list.append(name_text)
        except:
            # 跳过广告、系统推荐等非用户结果
            continue
    
    print("最终抓取结果:", pr_list)
finally:
    # 执行完自动关闭浏览器
    time.sleep(2)
    driver.quit()
补充说明
  • LinkedIn有反爬校验机制,登录时如果触发验证码、人机验证,需要手动完成验证后脚本才会继续执行。
  • 尽量不要用固定时长的time.sleep做等待,优先用显式等待,元素加载完成后会立刻执行下一步,脚本运行效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:21:22