Некорректно работает not/=false в XPath? Ищи другое решение!



  • Задача:

    Получить (!) классы каждой section за исключением не отображаемых (display: none).

    Дано:

    class='..' - набор различных классов.

    <div     class='a'>
    <article class='b ..'>
    
    <section class='c ..'> <div class='..'>point</>                                      </>
    <section class='c ..'> <span class='head'> point </> <span class='value'> point </>  </>
    
    <section class='c ..' style='display: none;'>                                        </>
    <section class='c ..' style='display: none;'> <span class='head'> trash </>          </>
    
    </>
    </>
    

    Решение:

    Работает при поиске в браузере (в BAS не работает):

    • //section[contains(@class, "с") and (contains(@style, "none"))=false]/@class
    • //section[not(contains(@style, "none"))]

    Работает в BAS (так как у span один класс можно не применять contains):

    • //span[contains(@class, "value")]/parent::section[contains(@class, "с")]/@class

    То есть сначала заход через дочерний элемент, класс value, потом через родителя.

    (для div'а нужно прописать аналог через | но это будет уже много)

    Где здесь ошибка?

    Картинки: (/@class убран)

    Пример с div через | :

    49fd3301-b502-46c1-9134-c5838c9dc034-изображение.png

    Пример здорового XPath :

    fc8b8f00-09cf-4b73-a245-92d58c3449f5-изображение.png



  • @y4n23x Приложите пример целой страницы и выделите на ней элементы, которые хотите получить



  • @y4n23x said in Некорректно работает not/=false в XPath? Ищи другое решение!:

    //section[not(contains(@style, "none"))]
    

    этот работает, но не всегда. Проблема в том что в бас нет варианта за раз взять все подходящие элементы. Надо перебирать в цикле.

    вот пример в первом варианте работает:
    https://dropmefiles.com/Dr9ps

    @Fox а вот этот уже к тебе вопрос - во втором варианте ошибку выдает, хотя если открыть действие - элементы видит.

    И еще по умолчанию в действии начать цикл, получить Колличество Элементов и в действии получить атрибут - не ставит вот это в поле xpath (то что там должно быть по умолчанию, как обычно)

     >XPATH>
    

    а без этого указателя находит один элемент а не 2

    В любом случае во втором варианте баг какой то.



  • Вот и я столкнулся на днях с этой проблемой не работает XPath поиск элементов на странице. Решением было Xpath встроенной в BAS! Вот старая выжимка поиска и она к сожалению не работает. 2022-11-16_170952.png



  • @Fox

    Поиск атрибута @class каждого видимого элемента section: (класс general-section), not(@style)

    Решение: (первые два видимых section не имеют span, и запрос для включения div в первой картинке)

    //span[contains(@class, "value")]/parent::section[contains(@class, "general-section")]/@class
    

    Выводит все атрибуты @class всех (!) нужных section . Единственное из предложенных рабочее.

    not или альтернатива =false работают в BAS, но очень проблемно. Хотя в браузере (не BAS'овском) ищет нормально.

    Например:

    //ul[contains(@class, "navbar-nav")]//a[not(@href="#")]
    

    нормально работает, но это для другой страницы и здесь получение текста, а не xml.

    -Почему просто не поставить not(@style)? - выведет в результат баннер.
    -Под видимым подразумевается section без @style='display: none'

    page.html



  • Вы бы шаблон тестовый приложили с разными примерами. А то я вот вообще понять не могу как вы за раз обработали несколько элементов.

    Я вам скинул шаблон в котором через not contains работает. Смотри выше.



  • (!) Причём, если [contains(@class, "value")] убрать и добавить исключение атрибута @style (будь то просто атрибут или его значение @style="..." или contains)

    //span/parent::section[contains(@class, "general-section") and not(contains(@style))]/@class
    

    Хоть мы и исключили скрытые section, но (!!!) только в запросе.

    (Результат ответа BAS = нету большинства скрытых section, но в результате есть две лишние)

    Почему? -Ответ очевиден, так как мы заходили с элемента span убрались те section, которые нам нужны и те которые нам не нужны, которые не содержат span.

    Вывод: Те же самые запросы в браузере через инспектор элементов (!) работают и выдают правильные значение, которые мы и запрашиваем. Следовательно not/=false работает нестабильно, ведь, если браузер обрабатывает мои запросы, то ошибки в них нету.



  • @Bigma

    Получаешь код страницы методом GET или сохраняешь страницу и читаешь файл, затем в BAS находишь XPath получить каждый xml или текст - задаёшь запрос - ??? - profit.



  • @y4n23x понял, я то думал ты со странице через браузер.



  • @y4n23x said in Некорректно работает not/=false в XPath? Ищи другое решение!:

    @Fox

    Поиск атрибута @class каждого видимого элемента section: (класс general-section), not(@style)

    Решение: (первые два видимых section не имеют span, и запрос для включения div в первой картинке)

    //span[contains(@class, "value")]/parent::section[contains(@class, "general-section")]/@class
    

    Выводит все атрибуты @class всех (!) нужных section . Единственное из предложенных рабочее.

    not или альтернатива =false работают в BAS, но очень проблемно. Хотя в браузере (не BAS'овском) ищет нормально.

    Например:

    //ul[contains(@class, "navbar-nav")]//a[not(@href="#")]
    

    нормально работает, но это для другой страницы и здесь получение текста, а не xml.

    -Почему просто не поставить not(@style)? - выведет в результат баннер.
    -Под видимым подразумевается section без @style='display: none'

    page.html

    А вы как проверяли работу в BAS?

    925052ea-093e-4b6d-b54c-e1cdde43d7d3-изображение.png

    Скрипт: 2457.xml


Log in to reply