首页 > 解决方案 > 检查子元素的文本后如何捕获父元素的文本

问题描述

store_block_list  = '//div[@class="amlocator-store-information"]'
anc ='//div[@class="amlocator-store-information"]/parent::div'


driver.get('https://www.charlottesweb.com/where-to-buy-charlottes-web/partner-locations')
wait = WebDriverWait(driver, 30)
storeElement = wait.until(EC.visibility_of_all_elements_located((By.XPATH, store_block_list)))
full_list = []
address_list = []
for store in storeElement:
    address = driver.execute_script('return arguments[0].childNodes[2].textContent;', store).strip()
    if address not in address_list:
        address_list.append(address)
        f=driver.find_element_by_xpath(anc)
        full_list.append(f.get_attribute('data-amid'))
driver.quit()
print(full_list)

我正在浏览这个站点,我正在尝试捕获地址文本并附加到地址_list,如果地址不在列表中,然后移动到 data-amid 并捕获它,我不直接捕获 dat-amid 的原因是一些地址不是唯一的,我只想在唯一地址中捕获数据。

标签: pythonpython-3.xseleniumselenium-webdriver

解决方案


要捕获数据,您可以运行:

   parent = store.find_element_by_xpath('..')
   grandparent = parent.find_element_by_xpath('..')
   data_amid = grandparent.get_attribute('data-amid')

这将返回数字值

您的代码的一个问题是您正在使用 'f' 中搜索数据find_element_by_xpath,这只会返回找到的第一个元素。如果不向上移动到祖父节点,则get_attribute调用将仅返回“无”,如果您确实从 f 向上移动到祖父节点,find_element_by_xpath则将始终在第一个元素处停止并返回“1”。

如果您使用('..')from 'store' 两次向上移动祖父节点然后运行,您可以获得 data-amid 属性。

这是在您的代码中:

    driver.get('https://www.charlottesweb.com/where-to-buy-charlottes-web/partner-locations')
    wait = WebDriverWait(driver, 30)
    storeElement = wait.until(EC.visibility_of_all_elements_located((By.XPATH, store_block_list)))
    full_list = []
    address_list = []
    for store in storeElement:
        address = driver.execute_script('return arguments[0].childNodes[2].textContent;', store).strip()
        if address not in address_list:
            address_list.append(address)
            parent = store.find_element_by_xpath('..')
            grandparent = parent.find_element_by_xpath('..')
            print(grandparent.get_attribute('data-amid'))
            full_list.append(grandparent.get_attribute('data-amid'))
    driver.quit()
    print(full_list)

推荐阅读