Можно ли начать считать с определенного div в Python, используя XPATH и Selenium? - PullRequest
1 голос
/ 26 мая 2019

У меня есть 80 div, каждый div (в нашем случае, класс 24, 27, 30) содержит 2 детей.

Можно ли начать считать, скажем, с 24-го ряда (ИСКЛЮЧАЯ ДЕТЕЙ),затем продолжайте считать строки под ним?(используя только XPATH, а не CSS-селекторы;))

<div class="container">
    ... # dots signify the divs before it
    <div class="24">
        <div class="25"></div>
        <div class="26"></div>
    </div>
    <div class="27">
        <div class="28"></div>
        <div class="29"></div>
    </div>
    <div class="30">
        <div class="31"></div>
        <div class="32"></div>
    </div>
    ... # divs after it
</div>

Есть ли что-то вроде:

Допустим,

x = 0
all_the_divs = driver.find_elements_by_xpath("//div/*")
while x < len(all_the_divs):
    # do something
    pass
    if x == 24:
        # catch all the divs under 24 (excluding 24)
        # something like:
        divs_under_x = len(driver.find_elements_by_xpath("//div/div[" + str(x) + "]::"))
       # or
       divs_under_x = len(driver.find_elements_by_xpath("//div/following-sibling::div[" + str(x) + "]*"))
        break
    x += 1

ВЫХОД: длина должна быть 2(класс 27 и 30 без детей) Большое спасибо.

Ответы [ 3 ]

1 голос
/ 27 мая 2019

Вы можете использовать Предикаты фильтра XPath , чтобы возвращать только дочерние элементы <div class="container">, которые больше, чем заданное число.

Соответствующее выражение будет:

//div[@class='container']/child::*[number(@class)>24]

переведено в Привязки Python и Selenium

divNumber = 24

interestingDivs = driver.find_elements_by_xpath(
    "//div[@class='container']/child::*[number(@class)>" + str(divNumber) + "]")

for interestingDiv in interestingDivs:
    print(interestingDiv.get_attribute("class"))

См. Синтаксис XPath статья для дополнительной информации

1 голос
/ 27 мая 2019

Вот так:

from lxml import etree

data = [your data above]


tree = lxml.etree.fromstring(data, parser=lxml.etree.HTMLParser())
targets = tree.xpath("*//div[(position()=2 or position()=3) and descendant::div]")
for i in targets:
    for child in i.getchildren():
        child.getparent().remove(child)
    print(etree.tostring(i).decode().replace('\n','').strip())

Выход:

<div class="27">        </div>
<div class="30">         </div>

Надеюсь, это, по крайней мере, в общем направлении того, что вы ищете ...

0 голосов
/ 27 мая 2019

Оказывается, вам нужно быть в узле, в котором вы хотите, чтобы у вас был брат (если вы хотите, чтобы у вас был брат class="24", вам нужно быть внутри узел class="24".

* т.е. 1011 *

x = 0
all_the_divs = driver.find_elements_by_xpath("//div/*")
while x < len(all_the_divs):
    # do something
    pass
    if x == 24:
        # catch all the divs under 24 (excluding 24)
        divs_under_x = len(driver.find_elements_by_xpath("//div/div[" + str(x) + "]/following-sibling::*"))
        print(len(divs_under_x))
        break
    x += 1

Это выведет, сколько div меньше class="24", за исключением его потомков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...