如何在angularjswebsi上用Python中的Selenium迭代保存动态表中的信息

2024-05-19 15:39:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从一个使用AngularJS的网站上的动态表中获取数据。我用Selenium来浏览网站。在

目前,我的问题是我无法标识动态表,因为没有标记。此外,行的id还有字符串形式的动态名称,这使问题更加复杂。感谢任何帮助。在

我尝试过按ID/XPATH搜索并将它们添加到元素列表中。没有成功。在

我需要的信息包含在一个由多个参数(收集日期)动态生成的大型表中:

<tctable id="tweb_EPVisitNumber_List_1">

有多行,包含多个其他参数。下面是我感兴趣的一个小专栏的例子。我想从生成的表中的所有元素获取所有日期。在

^{pr2}$

随着表的进展,ID将变为动态字符串,例如,其他列/行中的下一个元素将是:

id="web_EPVisitNumber_List_1-row-1-item-CollectionDate" 
id="web_EPVisitNumber_List_1-row-2-item-CollectionDate"
id="web_EPVisitNumber_List_1-row-3-item-CollectionDate"

等等

我的问题是,首先我无法在较大的表中找到特定的元素,而且当字符串动态变化时,我也无法遍历它。在


Tags: 字符串webid元素参数网站selenium动态
2条回答

您必须找到元素的一些公共属性,并基于它构造一个定位器。例如,在给定的示例中,所有感兴趣的span的id中都有“CollectionDate”,但没有“-label”(列标题有它)。
因此,一个xpath将是:

//span[contains(@id, "CollectionDate") and not contains(@id, "-label")]

另一个观察-所有“有趣”的都是div中的span,它位于tccol中,除了第一个是列标题:

^{pr2}$

要从生成的表中的所有元素中获取所有日期,因为这些元素是Angular元素,您需要归纳WebDriverWait以获得位于的所有元素的可见性,您可以使用以下解决方案:

  • 使用XPATH

    dates = []
    date_elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//tctable[starts-with(@id, 'tweb_EPVisitNumber_List_')]//span[contains(@class,'componentTableItemLabel') and normalize-space()='Collection Date']//following::span[1]/span[starts-with(@id, 'web_EPVisitNumber_List_')]")))
    for date_element in date_elements:
        dates.append(date_element.text)
    
  • 优化方式:

    dates = [date_element.text for date_element in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//tctable[starts-with(@id, 'tweb_EPVisitNumber_List_')]//span[contains(@class,'componentTableItemLabel') and normalize-space()='Collection Date']//following::span[1]/span[starts-with(@id, 'web_EPVisitNumber_List_')]")))]
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

相关问题 更多 >