求助:调用.get_attribute('href')时部分链接返回None的问题
问题解决:部分商品链接href返回None的处理
可能原因
- 部分商品的链接属性由JavaScript动态赋值,Selenium的
get_attribute('href')在元素未完全渲染、JS未执行完毕时会返回None - 页面内不同商品的链接元素结构存在差异,部分商品的链接未使用
hz-Listing-coverLink类名
解决方案
方案1:用JavaScript直接读取href属性
对于动态渲染的元素,通过JS获取属性比Selenium的get_attribute更可靠,修改链接获取逻辑:
link_element = artikel.find_elements(By.CLASS_NAME, 'hz-Listing-coverLink') if link_element: # 用JS读取元素的href属性 link = artikel.execute_script("return arguments[0].href", link_element[0]) else: # 备选:查找包含商品详情路径的a标签 alt_links = artikel.find_elements(By.XPATH, ".//a[contains(@href, '/v/')]") link = alt_links[0].get_attribute('href') if alt_links else '无有效链接'
方案2:等待href属性加载完成
使用显式等待确保链接元素的href属性已赋值,替代无效的time.sleep():
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def loop_artikelen(): artikelen = driver.find_elements(By.XPATH, "//*[@id='content']/div[2]/ul/li") artikelen_lijst = [] wait = WebDriverWait(driver, 10) for artikel in artikelen[0:15]: titel = artikel.find_element(By.CLASS_NAME, 'hz-Listing-title').text prijs = artikel.find_element(By.CLASS_NAME, 'hz-Listing-price').text # 等待链接元素出现,且href属性非空 link_element = wait.until( lambda d: d.find_element(By.CLASS_NAME, 'hz-Listing-coverLink').get_attribute('href') is not None ) link = link_element.get_attribute('href') artikelen_lijst.append((titel, prijs, link)) return artikelen_lijst
方案3:遍历商品元素下的所有有效链接
针对部分商品链接结构不同的情况,遍历所有a标签并筛选符合商品详情页规则的链接:
def loop_artikelen(): artikelen = driver.find_elements(By.XPATH, "//*[@id='content']/div[2]/ul/li") artikelen_lijst = [] for artikel in artikelen[0:15]: titel = artikel.find_element(By.CLASS_NAME, 'hz-Listing-title').text prijs = artikel.find_element(By.CLASS_NAME, 'hz-Listing-price').text link = None # 遍历当前商品下所有a标签 all_a_tags = artikel.find_elements(By.TAG_NAME, 'a') for tag in all_a_tags: href = tag.get_attribute('href') # 筛选包含商品详情路径的链接 if href and '/v/' in href and 'marktplaats.nl' in href: link = href break artikelen_lijst.append((titel, prijs, link if link else '无有效链接')) return artikelen_lijst
额外建议
- 避免使用固定层级的XPATH(如
//*[@id='content']/div[2]/ul/li),改用更稳定的类名定位,比如By.CLASS_NAME, 'hz-Listing-item'(如果页面存在该类) - 全程使用显式等待替代强制休眠,提升代码稳定性与执行效率
内容的提问来源于stack exchange,提问作者okanmutluprogramming
相关产品推荐
相关产品推荐

