Как найти номер нужного блока на странице?

matsa

Client
Регистрация
18.11.2012
Сообщения
37
Благодарностей
2
Баллы
8
Всем привет!
Такая задача. На странице много блоков:
HTML:
<div>
    <div class="sotrudnik">
        <div>Аркадий<div>
        
        <div>
            <h2>ЗП</h2>
            <div>100 000</div>
            <div>+ 50 000</div>
            <div>+ 10 000</div>
        </div>
    </div>

    <div class="sotrudnik">
        <div>Анатолий<div>
        
        <div>
            <h2>ЗП</h2>
            <div>100 000</div>
            <div>+ 50 000</div>
            <div>+ 10 000</div>
        </div>
    </div>
    
    <div class="sotrudnik">
        <div>Василий<div>
        
        <div>
            <h2>ЗП</h2>
            <div>100 000</div>
            <div>+ 50 000</div>
            <div>+ 10 000</div>
        </div>
    </div>

</div>
И вот в этой куче блоков, мне надо найти номер блока class="sotrudnik", который принадлежит Анатолию, как это сделать? -)
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 115
Баллы
113
Всем привет!
Такая задача. На странице много блоков:
HTML:
<div>
    <div class="sotrudnik">
        <div>Аркадий<div>
       
        <div>
            <h2>ЗП</h2>
            <div>100 000</div>
            <div>+ 50 000</div>
            <div>+ 10 000</div>
        </div>
    </div>

    <div class="sotrudnik">
        <div>Анатолий<div>
       
        <div>
            <h2>ЗП</h2>
            <div>100 000</div>
            <div>+ 50 000</div>
            <div>+ 10 000</div>
        </div>
    </div>
   
    <div class="sotrudnik">
        <div>Василий<div>
       
        <div>
            <h2>ЗП</h2>
            <div>100 000</div>
            <div>+ 50 000</div>
            <div>+ 10 000</div>
        </div>
    </div>

</div>
И вот в этой куче блоков, мне надо найти номер блока class="sotrudnik", который принадлежит Анатолию, как это сделать? -)
Если нужно взять массив информации принадлежащий Анатолию, то можно с помощью регулярки: <div>Анатолий<div>[\w\W]*?(?=<div\ class="sotrudnik">|$)

118397
 
  • Спасибо
Реакции: ZennoCat

matsa

Client
Регистрация
18.11.2012
Сообщения
37
Благодарностей
2
Баллы
8
Если нужно взять массив информации принадлежащий Анатолию, то можно с помощью регулярки: <div>Анатолий<div>[\w\W]*?(?=<div\ class="sotrudnik">|$)
Да, в целом, для получения значения - это пойдёт, но у меня стоит задача клика по этому искомому блоку
HTML:
            <div>+ 50 000</div>
 

IvanVish

Client
Регистрация
19.06.2020
Сообщения
26
Благодарностей
6
Баллы
3
Приветствую!
В xPath есть функция count(), которая возвращает число узлов. В вашем случае это будет выглядеть так:
xPath:
count(//div[text() = 'Анатолий']/ancestor::div[@class='sotrudnik']/preceding-sibling::div)

count() - получить число узлов
//div[text() = 'Анатолий'] - ищем div с текстом Анатолий
/ancestor::div[@class='sotrudnik'] - возвращаемся к предку div с class='sotrudnik'
/preceding-sibling::div - выбираем всех братьев и сестёр ДО ТЕКУЩЕГО УЗЛА (к результату нужно будет прибавить +1)
xPath прекрасен, задача реализуется одной строкой, НО!
Я не понимаю как это прикрутить к кубику ZennoPoster и спарсить результат. В ответ получаю ошибку, элемент не найден.
Кто разбирается, буду благодарен если подскажете.

Поэтому, придётся делать костыли на C#:
C#:
// Создаём список, парсим в него наши <div>
HtmlElementCollection colElements = instance.ActiveTab.FindElementsByXPath("//div[text() = 'Анатолий']/ancestor::div[@class='sotrudnik']/preceding-sibling::div");
// Получаем количество строк в нашем списке в int.
// Так как preceding-sibling берёт все предшествующие узлы, себя не считает, то +1
return colElements.Count + 1;
 
  • Спасибо
Реакции: baracuda

baracuda

Client
Регистрация
19.06.2013
Сообщения
793
Благодарностей
278
Баллы
63
ну а накой велосипед.. вяжемся прям так. Возможно написание не так.. но в общем суть я думаю примерно ясна.
//div[text() = 'Анатолий']//div(contains(text() = '50 000')]
 

IvanVish

Client
Регистрация
19.06.2020
Сообщения
26
Благодарностей
6
Баллы
3
ну а накой велосипед.. вяжемся прям так. Возможно написание не так.. но в общем суть я думаю примерно ясна.
//div[text() = 'Анатолий']//div(contains(text() = '50 000')]
Я показал как получить индекс элемента. Конечно, если нужно просто кликнуть, то можно намного проще реализовать.
В вашем примере может быть недостаток. Сомневаюсь что текст +50 000 будет всегда статичен.
Опять же, @matsa не даёт никаких уточнений по этому поводу.

Я бы сделал так:
//div[text() = 'Анатолий']/following-sibling::div[1]/div[2]
 
Последнее редактирование:

Lulz

Client
Регистрация
29.12.2023
Сообщения
12
Благодарностей
2
Баллы
3
Возможно будет лучше собирать все <div class="sotrudnik">. Далее фильтровать по вхождению, в данном случае Анатолий. Допустим используя переменную select. Ведь завтра нам может понадобиться Аркадий...

//div[text() = '{-Variable.select-}']/following-sibling::div[1]/div[2]
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)