HtmlElementCollection

AleksandrYolo

Client
Регистрация
06.04.2016
Сообщения
21
Благодарностей
4
Баллы
3
Похоже я переработал сегодня, стандартная процедура до этого не вызывала проблем.

Делаю коллекцию девушек по xpath и запускаю цикл по ним, получаю 10 Тань

HTML:
<article><h4>Татьяна77</h4></article>
<article><h4>Алена88</h4></article>
и тд до 10

Код:
Tab tab = instance.ActiveTab;
string post_xpath = "//article";

HtmlElementCollection posts = tab.FindElementsByXPath(post_xpath);

   foreach (HtmlElement post in posts.Elements)
   {      
    project.SendInfoToLog(post.FindChildByXPath("//h4", 0).InnerText);
   }
tanyas.jpg

А мне нужны ВСЕ понятное дело.
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63

AleksandrYolo

Client
Регистрация
06.04.2016
Сообщения
21
Благодарностей
4
Баллы
3
"//h4" на ".//h4" попробуй заменить
Спасибо, работает, но не могу понять откуда там данные первой девушки? Как они вообще могут быть доступны во всех итерациях цикла по коллекции?
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63

AleksandrYolo

Client
Регистрация
06.04.2016
Сообщения
21
Благодарностей
4
Баллы
3
Разве это важно?)
Конечно! Я же спать не смогу) Я то думал что у меня в каждой комнате по 1 девушке, и полная изоляция, а они оказывается доступные и ходить могут друг к другу...
 
  • Спасибо
Реакции: SergSh

russya

Client
Регистрация
08.07.2014
Сообщения
719
Благодарностей
77
Баллы
28

AleksandrYolo

Client
Регистрация
06.04.2016
Сообщения
21
Благодарностей
4
Баллы
3

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 352
Благодарностей
3 279
Баллы
113
не могу понять откуда там данные первой девушки?
// - ищет с начала страницы, в данном случае это происходит в каждой итерации foreach
. - относительно контекстного элемента

Это особенность JS и исходит из него.
 
Последнее редактирование:
  • Спасибо
Реакции: AleksandrYolo и Drom

Drom

Client
Регистрация
19.05.2016
Сообщения
54
Благодарностей
18
Баллы
8
Это особенность JS и исходит из него.
На JS всё было бы проще :-)
Добавляет в массив только те <h4>, которые находятся внутри <article> и выводит в консоль их innerHTML

Код:
var posts = document.querySelectorAll('article > h4');
for(var key of posts) console.log(key.innerHTML);
 
  • Спасибо
Реакции: AleksandrYolo

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 352
Благодарностей
3 279
Баллы
113
На JS всё было бы проще :-)
Так в зенке аналогично https://help.zennolab.com/en/v5/zennoposter/5.27.0.0/webframe.html#topic542.html
Код:
Tab tab = instance.ActiveTab;
string post_xpath = "//article";

HtmlElementCollection posts = tab.FindElementsByXPath(post_xpath);

   foreach (HtmlElement post in posts.Elements)
   {     
    project.SendInfoToLog(post.FindChildByXPath("//h4", 0).InnerText);
   }
Вообще, советую сначала получить корневой элемент и от него искать.
 
Последнее редактирование:
  • Спасибо
Реакции: AleksandrYolo и Drom

AleksandrYolo

Client
Регистрация
06.04.2016
Сообщения
21
Благодарностей
4
Баллы
3
// - ищет с начала страницы, в данном случае это происходит в каждой итерации foreach
Вообще, советую сначала получить корневой элемент и от него искать.
Но как это может происходить в каждой итерации если я формирую коллекцию из всех артиклов (корневых элементов от h4)? Селектор post.FindChildByXPath("//h4", 0) не должен знать ничего о других элементах т.к HtmlElement post содержать в себе должен только 1 объект <article><h4>имя</h4></article>
Видимо я что-то не улавливаю. Как сформировать коллекцию так, чтобы в каждом ее элементе было только <article><h4>имя</h4></article>, и селектор post.FindChildByXPath("//h4", 0) не имел доступа к другим и выполнял то, что от него требуется?
формирование коллекции через .//article не помогает. post.FindChildByXPath снова получает доступ к другим элементам
 
Последнее редактирование:

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Но как это может происходить в каждой итерации если я формирую коллекцию из всех артиклов (корневых элементов от h4)? Селектор post.FindChildByXPath("//h4", 0) не должен знать ничего о других элементах т.к HtmlElement post содержать в себе должен только 1 объект <article><h4>имя</h4></article>
Видимо я что-то не улавливаю. Как сформировать коллекцию так, чтобы в каждом ее элементе было только <article><h4>имя</h4></article>, и селектор post.FindChildByXPath("//h4", 0) не имел доступа к другим и выполнял то, что от него требуется?
формирование коллекции через .//article не помогает. post.FindChildByXPath снова получает доступ к другим элементам
точку перед путями нужно ставить в дочернем элементе
 
  • Спасибо
Реакции: AleksandrYolo

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 352
Благодарностей
3 279
Баллы
113
Селектор post.FindChildByXPath("//h4", 0) не должен знать ничего о других элементах
Меня тоже поначалу это удивило + подобная тема уже поднималась, но так работает document.evaluate.

Суть в том, что полученная нода - это ссылка на объект, что позволяет получить его соседей, родителя и т.д.,
с куском - это невозможно, xPath бы был убог.
 
Последнее редактирование:
  • Спасибо
Реакции: AleksandrYolo

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