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

#python #selenium #xpath #locators

Вопрос:

из приведенного ниже html я хочу получить divs между div1 и div два, мне нужна помощь в определении способа, которым я могу получить divs с помощью селена

 lt;div class="div"gt;lt;/divgt;  lt;divgt;lt;/divgt;  lt;divgt;lt;/divgt;  lt;divgt;lt;/divgt;  lt;divgt;lt;/divgt;  lt;div class="div2"gt;lt;/divgt;  

это код, который используется

 driver.find_element_by_xpath('.//div[@class="div1"]').find_elements_by_xpath('//following::div')  

Ответ №1:

Если вы хотите, чтобы дивы находились между

 div class div1  

и

 div class div2  

Пожалуйста, используйте ниже XPath

 .//div[@class='div1']//following-sibling::div[not(@class='div2')]  

В вашем коде что-то вроде этого :

 driver.find_element_by_xpath('.//div[@class="div1"]').find_elements_by_xpath(".//div[@class='div1']//following-sibling::div[not(@class='div2')]")  

чтобы проверить это, я создал фиктивный HTML,

введите описание изображения здесь

Как вы можете видеть, он выделяет 4 узла.

Поверьте, это помогает!

Ответ №2:

В вашем случае селектор css был бы лучшим решением:

 const cssSelector = ".div ~ div:not(.div2 ~ *):not(.div2)"  

В основном то, что он делает, это:

 .div ~ // selects siblings  div:not(.div2 ~ *):not(.div2) // selects all div tags expect ones that are after .div2 and .div2 itself  

Вы можете попробовать это с помощью:

 document.querySelectorAll(".div ~ div:not(.div2 ~ *):not(.div2)");  

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

1. Почему это лучше?

2. Если вы можете сделать выражение пути XPath короче, чем cssSelector, которое я предоставил (для вашего конкретного случая), я бы сказал, что решение XPath лучше.