Сделать XPath остановкой на определенной глубине? - PullRequest
0 голосов
/ 25 марта 2019

У меня есть следующий HTML

<span class="medium bold day-time-clock">
            09:00
            <div class="tooltip-box first-free-tip ">
                <div class="tooltip-box-inner">
                    <span class="fa fa-clock-o"></span>
                    Some more text
                </div>
            </div>
        </span>

Я хочу XPath, который получает только текст 09: 00 , а не Еще немного текста НЕ использует text()[1], потому что это вызывает другие проблемы. Мой текущий XPath выглядит так

("//span[1][contains(@class, 'day-time-clock')]/text()")

Я хочу тот, который игнорирует всю эту часть HTML

    <div class="tooltip-box first-free-tip ">
        <div class="tooltip-box-inner">
            <span class="fa fa-clock-o"></span>
            Some more text
        </div>
    </div>

Ответы [ 3 ]

0 голосов
/ 26 марта 2019

Вы можете ограничить уровень descendant:: узлов с помощью position().
Таким образом, следующее выражение работает:

span/descendant::node()[2 > position()]

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


Другой подход ограничивает как предков, так и потомков:

span/descendant::node()[3 > count(ancestor::*) and 1 > count(descendant::*)]

Здесь вы также должны скорректировать числа в предикатах, чтобы получить какие-либо полезные результаты.

0 голосов
/ 26 марта 2019

Я думаю (если я вас правильно понимаю), что

"..//div[contains(@class, 'tooltip-box')]/parent::span"

доставит вас туда.

0 голосов
/ 26 марта 2019

Используйте normalize-space() для выбора всех непробельных узлов документа:

//span[contains(@class, 'day-time-clock')]/text()[normalize-space()]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...