HtmlElementCollection

Discussion in 'Вопросы новичков' started by AleksandrYolo, Apr 17, 2019.

  1. AleksandrYolo

    AleksandrYolo Client

    Joined:
    Apr 6, 2016
    Messages:
    13
    Likes Received:
    1
    Похоже я переработал сегодня, стандартная процедура до этого не вызывала проблем.

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

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

    Code (text):
    1.  
    2. Tab tab = instance.ActiveTab;
    3. string post_xpath = "//article";
    4.  
    5. HtmlElementCollection posts = tab.FindElementsByXPath(post_xpath);
    6.  
    7.    foreach (HtmlElement post in posts.Elements)
    8.    {      
    9.     project.SendInfoToLog(post.FindChildByXPath("//h4", 0).InnerText);
    10.    }
    11.  
    tanyas.jpg
    А мне нужны ВСЕ понятное дело.
     
  2. SergSh

    SergSh Client

    Joined:
    May 10, 2017
    Messages:
    333
    Likes Received:
    214
    "//h4" на ".//h4" попробуй заменить
     
    AleksandrYolo likes this.
  3. AleksandrYolo

    AleksandrYolo Client

    Joined:
    Apr 6, 2016
    Messages:
    13
    Likes Received:
    1
    Спасибо, работает, но не могу понять откуда там данные первой девушки? Как они вообще могут быть доступны во всех итерациях цикла по коллекции?
     
  4. SergSh

    SergSh Client

    Joined:
    May 10, 2017
    Messages:
    333
    Likes Received:
    214
    Разве это важно?)
     
  5. AleksandrYolo

    AleksandrYolo Client

    Joined:
    Apr 6, 2016
    Messages:
    13
    Likes Received:
    1
    Конечно! Я же спать не смогу) Я то думал что у меня в каждой комнате по 1 девушке, и полная изоляция, а они оказывается доступные и ходить могут друг к другу...
     
    SergSh likes this.
  6. russya

    russya Client

    Joined:
    Jul 8, 2014
    Messages:
    558
    Likes Received:
    43
  7. AleksandrYolo

    AleksandrYolo Client

    Joined:
    Apr 6, 2016
    Messages:
    13
    Likes Received:
    1
    все правильно там, я создаю коллекцию posts, затем я делаю цикл по ней в переменную post)
     
  8. Zymlex

    Zymlex Client

    Joined:
    Oct 24, 2016
    Messages:
    1,335
    Likes Received:
    673
    // - ищет с начала страницы, в данном случае это происходит в каждой итерации foreach
    . - относительно контекстного элемента

    Это особенность JS и исходит из него.
     
    Last edited: Apr 18, 2019
    AleksandrYolo and Drom like this.
  9. Drom

    Drom Client

    Joined:
    May 19, 2016
    Messages:
    44
    Likes Received:
    10
    На JS всё было бы проще :-)
    Добавляет в массив только те <h4>, которые находятся внутри <article> и выводит в консоль их innerHTML

    Code (text):
    1.  
    2. var posts = document.querySelectorAll('article > h4');
    3. for(var key of posts) console.log(key.innerHTML);
    4.  
     
    AleksandrYolo likes this.
  10. Zymlex

    Zymlex Client

    Joined:
    Oct 24, 2016
    Messages:
    1,335
    Likes Received:
    673
    Так в зенке аналогично https://help.zennolab.com/en/v5/zennoposter/5.27.0.0/webframe.html#topic542.html
    Вообще, советую сначала получить корневой элемент и от него искать.
     
    Last edited: Apr 18, 2019
    AleksandrYolo and Drom like this.
  11. AleksandrYolo

    AleksandrYolo Client

    Joined:
    Apr 6, 2016
    Messages:
    13
    Likes Received:
    1
    Но как это может происходить в каждой итерации если я формирую коллекцию из всех артиклов (корневых элементов от h4)? Селектор post.FindChildByXPath("//h4", 0) не должен знать ничего о других элементах т.к HtmlElement post содержать в себе должен только 1 объект <article><h4>имя</h4></article>
    Видимо я что-то не улавливаю. Как сформировать коллекцию так, чтобы в каждом ее элементе было только <article><h4>имя</h4></article>, и селектор post.FindChildByXPath("//h4", 0) не имел доступа к другим и выполнял то, что от него требуется?
    формирование коллекции через .//article не помогает. post.FindChildByXPath снова получает доступ к другим элементам
     
    Last edited: Apr 18, 2019
  12. SergSh

    SergSh Client

    Joined:
    May 10, 2017
    Messages:
    333
    Likes Received:
    214
    точку перед путями нужно ставить в дочернем элементе
     
    AleksandrYolo likes this.
  13. Zymlex

    Zymlex Client

    Joined:
    Oct 24, 2016
    Messages:
    1,335
    Likes Received:
    673
    Меня тоже поначалу это удивило + подобная тема уже поднималась, но так работает document.evaluate.

    Суть в том, что полученная нода - это ссылка на объект, что позволяет получить его соседей, родителя и т.д.,
    с куском - это невозможно, xPath бы был убог.
     
    Last edited: Apr 18, 2019
    AleksandrYolo likes this.

Пользователи просматривающие тему (Пользователей: 0, Гостей: 0)