Python Selenium—获取与其关联的Web元素';s标签不断变化

Python Selenium—获取与其关联的Web元素';s标签不断变化,python,selenium-webdriver,xpath,css-selectors,webdriverwait,Python,Selenium Webdriver,Xpath,Css Selectors,Webdriverwait,给定一个搜索词,我试图获取亚马逊上图书分类下的结果,并获取给定搜索词下每本书的详细信息 我遇到了一个问题,有时我的代码能够找到结果,而有时它失败了。在进一步检查之后,我意识到这些项目有时用标签列出,有时用标签列出 下面粘贴的是用于备份我的声明的同一元素的元素和代码片段 带有标记的HTML: <li id="result_0" data-asin="0128023074" class="s-result-item celwidget "> <div data-asin="0

给定一个搜索词,我试图获取亚马逊上图书分类下的结果,并获取给定搜索词下每本书的详细信息

我遇到了一个问题,有时我的代码能够找到结果,而有时它失败了。在进一步检查之后,我意识到这些项目有时用
  • 标签列出,有时用
    标签列出

    下面粘贴的是用于备份我的声明的同一元素的元素和代码片段

    带有
  • 标记的HTML:

    <li id="result_0" data-asin="0128023074" class="s-result-item celwidget  ">
    
    <div data-asin="0128023074" data-index="0" class="sg-col-20-of-24 s-result-item sg-col-0-of-12 sg-col-28-of-32 sg-col-16-of-20 sg-col sg-col-32-of-36 sg-col-12-of-16 sg-col-24-of-28" data-cel-widget="search_result_0"><div class="sg-col-inner">
    

    有人能帮我理解为什么标签会发生这样的变化,以及如何处理这样的情况吗?

    关于为什么会发生这种情况的第一个问题,我不确定。我尝试了不同的操作系统/浏览器和窗口大小,但无法重现
    div
    元素的情况

    为了改进您的代码,我有一个建议,但它可能不是您的最佳解决方案,所以您可以尝试一下。这将等待两种类型的元素中的任何一种同时可见,而不是先等待10秒再等待第二种类型

    try:
        book = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//*[(@id="result_0") or (@data-index="0" and @data-cel-widget="search_result_0")]')))
    except TimeoutException:
        print("Did not find search result")
    else:
        # So atleast one of the tag type is visible.
        # Even if the attribute is not present then it will return None.
        if book.get_attribute('id') == "result_0":
            book_detail(book, details)
        else:
            book_detail_by_div(book, details)
    

    我按照问题和
    https://www.amazon.com
    搜索文本数据和分析剧本显示了相同的元素

    因此,您使用
    标记的观察是正确的。但是我在搜索结果附近没有找到任何相关的标签

    解决方案 要确定所需的元素,您需要为元素located()的可见性引入WebDriverWait,您可以使用以下任一解决方案:

    • 使用
      CSS\u选择器

      book = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.sg-col-inner h5 a:first-child")))
      
    • 使用
      XPATH

      book = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='sg-col-inner']//h5//following::a[1]/span")))
      

    。请读一读为什么会这样。考虑使用格式化的基于文本的相关HTML、代码试验和错误堆栈跟踪更新问题。@ DebanjanB,我编辑了我的问题以包含代码片段。
    book = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='sg-col-inner']//h5//following::a[1]/span")))