Python Selenium如何抓取两个h3标签间div下的所有li元素
解决Selenium抓取h3对应下方li的问题
你的问题出在XPath的范围控制上,当前代码会抓取当前h3之后所有同级privacy-type__grid容器里的li,而不是仅当前h3对应的那部分。以下是两种可行的解决方案:
方案一:定位父容器(推荐)
观察页面结构,每个h3和它对应的li容器privacy-type__grid都包裹在同一个privacy-type父元素里。直接定位这些父元素,就能精准获取每个h3对应的li:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 定位所有隐私项的父容器 privacy_items = WebDriverWait(driver, 15).until( EC.presence_of_all_elements_located((By.XPATH, "//div[@class='privacy-type']")) ) for item in privacy_items: # 获取当前项的h3文本 h3_text = item.find_element(By.XPATH, ".//h3[@class='privacy-type__purpose-heading']").text print(h3_text) # 获取当前项内的所有li li_tags = item.find_elements(By.XPATH, ".//div[@class='privacy-type__grid']/descendant::li") for li in li_tags: print(li.text) print('-----------------------')
方案二:修改XPath范围
如果不想改变定位逻辑,可以修改XPath,限制只抓取当前h3之后、下一个h3之前的li:
h3_tags = WebDriverWait(driver, 15).until( EC.presence_of_all_elements_located((By.XPATH, "//h3[@class='privacy-type__purpose-heading']")) ) for i in range(len(h3_tags)): current_h3 = h3_tags[i] if i < len(h3_tags) - 1: # 非最后一个h3:只取到下一个h3之前的div里的li li_xpath = "./following-sibling::div[@class='privacy-type__grid'][following-sibling::h3[@class='privacy-type__purpose-heading'][1] = following-sibling::h3[@class='privacy-type__purpose-heading'][{}]]/descendant::li".format(i+2) else: # 最后一个h3:取所有后续div里的li li_xpath = "./following-sibling::div[@class='privacy-type__grid']/descendant::li" li_tags = current_h3.find_elements(By.XPATH, li_xpath) print(current_h3.text) for li in li_tags: print(li.text) print('-----------------------')
方案一利用页面的天然结构分组,逻辑更清晰也更稳定,避免了XPath范围判断的复杂逻辑,优先推荐使用。
内容的提问来源于stack exchange,提问作者XYWnot
相关产品推荐
相关产品推荐

