如何用Selenium获取指定类_3GlyB下的图片?
Selenium 爬取图片:精准获取指定元素内的图片资源
问题场景
我正在用Selenium做网页爬取,需要收集名称和图片两类信息列表。目前已成功获取名称列表,代码如下:
### 点击右侧区域 browser.find_element("xpath","/html/body/div[1]/div/div/div[3]/div/div[2]/div[2]/div/div").click() ### 收集名称 nomes_ls_contatos = browser.find_elements(By.CLASS_NAME, "zoWT4") len(nomes_ls_contatos) # 结果为21 nomes_ls_contatos[1].text
但获取图片时遇到问题:
- 最初通过标签名获取所有图片,会混入3张无关图片:
### 收集图片 fotos_ls_contatos = browser.find_elements(By.TAG_NAME, "img") len(fotos_ls_contatos) # 结果为24 print(fotos_ls_contatos[1].get_attribute("src"))
- 发现目标图片都在类名为
_3GlyB的元素内,但直接获取该类元素后,.text返回空字符串,无法拿到图片信息:
fotos_ls_contatos = browser.find_elements(By.CLASS_NAME, "_3GlyB") len(fotos_ls_contatos) # 结果为20 fotos_ls_contatos[1].text
我需要实现类似browser.find_elements(By.CLASS_NAME, "_3GlyB").find_elements(By.TAG_NAME, "img")的嵌套查找逻辑,就像我用R语言实现的功能一样:
# 收集名称 nome_remetente <- lista_mensagens[[1]] |> rvest::read_html() |> rvest::html_elements("._3vPI2") |> rvest::html_elements(".zoWT4") |> rvest::html_element("span") |> rvest::html_text() |> as.data.frame() |> dplyr::rename(nome = 1) |> dplyr::filter(!is.na(nome)) # 收集图片 imagem_remetente <- lista_mensagens[[1]] |> rvest::read_html() |> rvest::html_elements("._1Oe6M") |> rvest::html_elements("._2EU3r") |> rvest::html_elements("._3GlyB") |> rvest::html_elements("img") |> rvest::html_attr("src") |> as.data.frame() |> dplyr::rename(imagem = 1)
解决方案
方法一:遍历容器元素嵌套查找
Selenium中find_elements返回的是元素列表,无法直接链式调用,但可以遍历每个_3GlyB容器,在内部查找图片:
# 获取所有目标容器 containers = browser.find_elements(By.CLASS_NAME, "_3GlyB") # 遍历容器提取图片src fotos_ls_contatos = [] for container in containers: img = container.find_element(By.TAG_NAME, "img") src = img.get_attribute("src") if src: fotos_ls_contatos.append(src) # 查看结果 len(fotos_ls_contatos) print(fotos_ls_contatos[1])
方法二:用CSS选择器直接定位
通过CSS选择器一步定位_3GlyB类下的img元素,无需遍历:
# 直接获取目标图片元素 fotos_ls_contatos = browser.find_elements(By.CSS_SELECTOR, "._3GlyB img") # 提取所有有效src src_list = [img.get_attribute("src") for img in fotos_ls_contatos if img.get_attribute("src")] len(src_list) print(src_list[1])
方法三:用XPATH定位
同样可以通过XPATH直接指定层级关系:
fotos_ls_contatos = browser.find_elements(By.XPATH, "//div[contains(@class, '_3GlyB')]/img") src_list = [img.get_attribute("src") for img in fotos_ls_contatos if img.get_attribute("src")]
以上三种方法都能实现和R语言嵌套查找一致的逻辑,精准获取目标容器内的图片资源,避免无关图片混入。
内容的提问来源于stack exchange,提问作者RxT
相关产品推荐
相关产品推荐

