Некорректно работает 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 через | :
Пример здорового XPath :
-
@y4n23x Приложите пример целой страницы и выделите на ней элементы, которые хотите получить
-
@y4n23x said in Некорректно работает not/=false в XPath? Ищи другое решение!:
//section[not(contains(@style, "none"))]
этот работает, но не всегда. Проблема в том что в бас нет варианта за раз взять все подходящие элементы. Надо перебирать в цикле.
вот пример в первом варианте работает:
https://dropmefiles.com/Dr9ps@Fox а вот этот уже к тебе вопрос - во втором варианте ошибку выдает, хотя если открыть действие - элементы видит.
И еще по умолчанию в действии начать цикл, получить Колличество Элементов и в действии получить атрибут - не ставит вот это в поле xpath (то что там должно быть по умолчанию, как обычно)
>XPATH>
а без этого указателя находит один элемент а не 2
В любом случае во втором варианте баг какой то.
-
Вот и я столкнулся на днях с этой проблемой не работает XPath поиск элементов на странице. Решением было Xpath встроенной в BAS! Вот старая выжимка поиска и она к сожалению не работает.
-
Поиск атрибута @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'
-
Вы бы шаблон тестовый приложили с разными примерами. А то я вот вообще понять не могу как вы за раз обработали несколько элементов.
Я вам скинул шаблон в котором через 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 работает нестабильно, ведь, если браузер обрабатывает мои запросы, то ошибки в них нету.
-
Получаешь код страницы методом GET или сохраняешь страницу и читаешь файл, затем в BAS находишь XPath получить каждый xml или текст - задаёшь запрос - ??? - profit.
-
@y4n23x понял, я то думал ты со странице через браузер.
-
@y4n23x said in Некорректно работает not/=false в XPath? Ищи другое решение!:
Поиск атрибута @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'А вы как проверяли работу в BAS?
Скрипт: 2457.xml