如何用Selenium Python定位特定图片并获取其src属性值
问题
我想获取一张图片的src属性值,但要么找不到对应的元素,要么筛选不出需要的图片。
我试过几种不同的XPath和CSS选择器,包括:
imgsrc = driver.find_element(By.CSS_SELECTOR, 'button[class="pv-top-card-profile-picture__image pv-top-card-profile-picture__image--show ember-view"]') #imgsrc = driver.find_element(By.XPATH, "//img[@class='pv-top-card-profile-picture pv-top-card-profile-picture']")
上述代码无法找到元素。
imgsrc = driver.find_element(By.XPATH, "[//img[contains(@src, 'profile-displayphoto')]")
这个选择器范围太广,会定位到错误的图片。
对应的HTML结构如下:
<div class="pv-top-card__non-self-photo-wrapper ml0"> <button class="pv-top-card-profile-picture pv-top-card-profile-picture__container display-block pv-top-card__photo presence-entity__image EntityPhoto-circle-9 " type="button"> <img width="200" title="" src="https://media.licdn.com/dms/image/C4E03AQEW8FzkdjFD-w/profile-displayphoto-shrink_400_400/0/1516275678440?e=1683158400&v=beta&t=vmGZHtwkrttxt85prjTTySrnybP7L6lX858TpFgtWaQ" height="200" alt="" id="ember818" class="pv-top-card-profile-picture__image pv-top-card-profile-picture__image--show ember-view"> <!----> <!----> </button> <div class="presence-entity__indicator presence-entity__indicator--size-9 presence-indicator hidden presence-indicator--size-9"> <span class="visually-hidden"> Status is offline </span> </div> </div>
解决方案
问题分析
- 第一个CSS选择器错误定位了
button元素,且把img的类名套用到了button的选择器上,目标img实际是button的子元素。 - 第二个XPath里的
img类名与实际HTML不匹配,实际img的类是pv-top-card-profile-picture__image pv-top-card-profile-picture__image--show ember-view,并非你写的内容。 - 第三个XPath存在语法错误(多了开头的
[),且仅通过src字符串筛选范围过宽。
正确定位方式
以下几种选择器可精准定位目标图片:
方式1:结合父容器与img类名的CSS选择器
# 先定位父容器,再选择内部的目标img imgsrc = driver.find_element(By.CSS_SELECTOR, 'div.pv-top-card__non-self-photo-wrapper img.pv-top-card-profile-picture__image--show') # 获取src属性值 img_src = imgsrc.get_attribute('src')
方式2:结合父容器的XPath定位
# 通过父div找到内部button里的目标img imgsrc = driver.find_element(By.XPATH, "//div[@class='pv-top-card__non-self-photo-wrapper ml0']//img[contains(@class, 'pv-top-card-profile-picture__image--show')]") img_src = imgsrc.get_attribute('src')
方式3:父容器+src特征的组合筛选
如果担心类名变动,可结合父容器缩小范围后再用src特征筛选:
imgsrc = driver.find_element(By.XPATH, "//div[@class='pv-top-card__non-self-photo-wrapper ml0']//img[contains(@src, 'profile-displayphoto')]") img_src = imgsrc.get_attribute('src')
额外提示
定位前需确保页面加载完成,推荐使用显式等待避免元素未加载的问题:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 最多等待10秒,直到目标元素出现 imgsrc = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'div.pv-top-card__non-self-photo-wrapper img.pv-top-card-profile-picture__image--show')) ) img_src = imgsrc.get_attribute('src')
内容的提问来源于stack exchange,提问作者Jesper Ezra
相关产品推荐
相关产品推荐

