如何抓取网页中不可见的href链接?附Selenium代码问题咨询
问题分析与解决
为什么看不到href但能复制链接?
- 链接属性是JavaScript动态生成的:页面加载完成后,网站通过JS脚本在运行时给
<a>元素添加href属性。你检查页面时看到的是初始DOM状态,此时href还未被注入;但手动复制时,浏览器已经执行完JS,能获取到动态生成的href值。 - 网站基于Salesforce Lightning框架:这类框架的很多元素属性不会直接写在静态HTML里,而是通过框架动态绑定,所以初始源码中看不到,但实际交互时元素已具备完整属性。
你的Selenium代码问题及修正
原代码的核心问题是CSS选择器错误,同时使用固定等待不够可靠,导致无法正确抓取链接。以下是修正后的代码:
import random from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC user_agents = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15" ] driver_path = '/users/tosh/downloads/chromedriver' user_agent = random.choice(user_agents) chrome_options = Options() chrome_options.add_argument(f"user-agent={user_agent}") driver = webdriver.Chrome(executable_path=driver_path, options=chrome_options) url = 'https://www.dataprivacyframework.gov/s/participant-search' driver.get(url) # 等待Inactive标签可点击后再点击 WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="Inactive__item"]')) ).click() # 等待所有链接元素加载完成 links = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'a.slds-text-heading_small.lgorg')) ) link_list = [] for link in links: href = link.get_attribute('href') if href: link_list.append(href) print(link_list) driver.quit()
关键修正说明
- CSS选择器修正:原代码中
a.slds-text-heading_small lgorg是错误写法,lgorg是元素的另一个class,正确写法是用点连接:a.slds-text-heading_small.lgorg,这样才能匹配同时拥有这两个class的链接元素。 - 用显式等待替代固定sleep:
time.sleep是固定等待,无法适配页面加载速度差异。显式等待会等到元素满足条件(可点击/已加载)再执行操作,避免因加载慢导致的抓取失败。 - 过滤空href:添加判断确保只收集有效的链接,避免空值混入结果。
内容的提问来源于stack exchange,提问作者Tosh_gitonga
相关产品推荐
相关产品推荐

