Python Selenium: Как получить элементы из нескольких html-списков неопределенной длины, которые имеют одинаковый относительный xpath?

#python #html #selenium #xpath

Вопрос:

Я просматриваю страницу, на которой ищу все элементы в следующих списках:

 description = driver.find_elements(By.XPATH, "//div[contains(@class,'list') and h1/text()='Values']/ul[@class='bullet-list']")  

Но на данной странице их неизвестное количество, в основном от 3 до 10. Также в каждом списке есть неизвестное количество элементов (количество элементов в каждом списке не совпадает). Если я буду искать элементы списка как таковые:

 description = driver.find_elements(By.XPATH, "//div[contains(@class,'list') and h1/text()='Values']/ul[@class='bullet-list']/li")  

Я получаю все элементы списка, но теперь я не знаю, к какому списку они принадлежали.

То, что я хочу сделать, это что-то вроде этого

 description = driver.find_elements(By.XPATH, "//div[contains(@class,'list') and h1/text()='Values']/ul[@class='bullet-list']") for x in range(len(description)):  values = driver.find_elements(By.XPATH, f"{description[x].xpath}/li")  for y in values:  b_list.append(y.text)  a_list.append(b_list)  

Так что вы можете понять, почему мне нужно знать, из какого списка исходят элементы, чтобы они могли быть внутри одного и того же [].

Я могу использовать абсолютный xpath для решения этой проблемы, но будет лучше, если я смогу найти способ с относительным xpath.

Ответ №1:

Если вы хотите получить элементы из нескольких списков, вы можете попробовать

 lists = [] description = driver.find_elements(By.XPATH, "//div[contains(@class,'list') and h1='Values']/ul[@class='bullet-list']") for _list in description:  lists.append([li.text for li in _list.find_elements(By.XPATH, './li')]) print(lists)  

Комментарии:

1. Спасибо, что сделали свое дело, я пробовал то же самое решение раньше, но для xpath я использовал «/li «вместо». /li», что ничего не дало, и поэтому я подумал, что это решение не сработало. Спасибо!