【问题标题】:Selenium to get image within div elementSelenium 在 div 元素中获取图像
【发布时间】:2021-12-16 22:52:58
【问题描述】:

我正在尝试使用 selenium 从网站收集一些信息。 我对 div 元素中的一些信息(img)感兴趣:

<div class="entry-content clearfix"> 
 ...
  <img data-attachment-id="7677" data-permalink="https://test_site.com/leftcentre/" ... alt="Example of site" >
  <img data-attachment-id="98231" data-permalink="https://test_site.com/high/" ... alt="another site" >

img data-attachment-id 的值可能会改变:所以我可以有 7677、7664 和其他值。这意味着我可以在许多其他 Xpath 中拥有以下 Xpath:

  •     //*[@id="post-63779"]/div/h2[1]/img[1]
    
  •     //*[@id="post-781"]/div/header/h1/a/img
    

到目前为止,我为提取此信息所做的工作如下所示:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time
        
        driver=webdriver.Chrome('my_path')            
        response=driver.get('https://website)
                
        wait = WebDriverWait(driver, 20)
        
        x = driver.find_element_by_xpath('//*[@id="post-781"]/div/header/h1/a/img').text

        # print(x)
        
        return x

但可能我犯了一些错误,因为我没有输出并且 chrome 仍在继续寻找元素。 我想知道是否有机会在不明确引用 div 和 img 之间的帖子编号或元素的情况下获取图像,或者只是提取所有 img data-attachment-id 信息。 如果我的问题或路径不清楚,请告诉我,我会为您提供更多信息。

【问题讨论】:

    标签: python selenium web-scraping xpath selenium-chromedriver


    【解决方案1】:

    属性data-attachment-id的值是动态生成的。因此,每次访问 AUT(被测应用程序)时,该值都会不断变化。

    因此,无法使用预定义的静态 locator strategy 定位相同的元素。

    在这些情况下,解决方案是使用动态locator strategies


    参考文献

    您可以在以下位置找到一些关于动态定位器的相关详细讨论:


    更新

    除了 data-attachment-id 属性值中的每个数字之外,任何一个属性都应该有一个唯一值,您必须使用它来唯一地标识元素。否则,您也可以使用索引。例如,要提取文本站点示例,您可以使用以下Locator Strategies

    • 使用css_selector

      print(driver.find_element_by_css_selector("div.entry-content img[data-attachment-id][data-permalink*='leftcentre']").get_attribute("alt"))
      
    • 使用xpath

      print(driver.find_element_by_xpath("//div[@class='entry-content clearfix']//img[@data-attachment-id and contains(@data-permalink, 'leftcentre')]").get_attribute("alt"))
      

    【讨论】:

    • 非常感谢您的帮助和参考,DebanjanB。据我了解,在我的情况下,我可能需要更喜欢以或包含开头以包含帖子://*[starts-with(@id, coption]/div/h2[1]/img[1]。但是,我不清楚如何使用 contains 包含有关 div 和 img 的信息
    • 查看答案更新并告诉我状态。
    猜你喜欢
    • 2023-02-06
    • 2020-01-07
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2013-08-28
    • 2018-06-06
    相关资源
    最近更新 更多