如何用Python Selenium获取LinkedIn兴趣页a标签的href并点击?
问题解决:获取LinkedIn关注公司的href并点击
核心原因
你之前输出元素文本而非href,是因为直接调用了element.text——这是获取元素的显示文本内容,而href是a标签的属性值,必须用get_attribute('href')来提取。
至于之前用By.PARTIAL_LINK_TEXT和含文本的XPATH失败,主要是LinkedIn页面的特性导致:
- 页面元素是动态渲染的,可能你定位时元素还没加载完成;
- 公司名称通常嵌套在a标签的子节点(如
<span>)里,而非a标签本身的文本,导致基于文本的定位方法找不到目标元素; - LinkedIn的class、id等属性经常动态生成,靠文本或不稳定属性定位容易失效。
解决方案
步骤1:用显式等待确保元素加载
LinkedIn页面加载慢,必须用显式等待代替硬等待,保证目标元素已渲染完成。
步骤2:用结构型选择器定位a标签
放弃依赖文本的定位方式,改用基于页面结构的XPATH或CSS选择器,比如通过公司卡片容器+href包含company(LinkedIn公司页URL都带这个关键词)来定位。
步骤3:提取href并执行点击
先收集所有href(避免页面跳转后元素失效),再逐个处理点击。
代码示例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器 driver = webdriver.Chrome() driver.get("https://www.linkedin.com/in/你的用户名/interests/") # 需确保已登录LinkedIn,可提前手动登录或添加登录逻辑 # 显式等待公司列表加载完成,XPATH需根据实际页面调整(F12查看元素结构) wait = WebDriverWait(driver, 15) # 定位所有公司卡片中的a标签(href含company) company_link_elements = wait.until(EC.presence_of_all_elements_located( (By.XPATH, "//div[contains(@class, 'interest-card__content')]//a[contains(@href, '/company/')]") )) # 先收集所有href到列表 company_hrefs = [link.get_attribute('href') for link in company_link_elements] # 遍历href并点击(用新窗口打开避免当前页面跳转后元素丢失) for href in company_hrefs: print(f"公司链接:{href}") # 新窗口打开链接 driver.execute_script("window.open(arguments[0]);", href) # 如果要在当前窗口打开,直接用driver.get(href),但会中断遍历,需重新加载兴趣页
关键细节说明
get_attribute('href'):专门用于提取元素的属性值,这是你之前忽略的核心点;- 显式等待
presence_of_all_elements_located:等待所有目标元素加载完成,避免动态渲染导致的定位失败; - 结构型XPATH:比如
//div[contains(@class, 'interest-card__content')]定位公司卡片容器,再找内部的a标签,比文本定位稳定得多; - 新窗口打开:直接点击
link.click()会导致当前页面跳转,后续元素会变成"过时元素"(StaleElementReferenceException),所以先收集所有href再用JS打开新窗口更稳妥。
内容的提问来源于stack exchange,提问作者michal_levin
相关产品推荐
相关产品推荐

