Исключить некоторые дочерние узлы из результата XPath с помощью одного вызова element.getText ()? - PullRequest
0 голосов
/ 12 февраля 2020

Я хочу извлечь содержимое, соответствующее XPath: .//*[contains (@class, 'post-content')] Однако я хочу sh исключить дочерние узлы:

1) Содержащий текст: P3 или AP

2) Div, содержащий id = bottom

3) Форма, содержащая ярлык с текстом: Получить обновления по электронной почте

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

<div class="td-post-content">
    <p>P1</p>
    <p>P2</p>
    <p>P3</p>
    <p>P4</p>
    <p>P5</p>
    <p>AP</p>
    <div id="td-a-rec bottom"> </div>
    <form action="https://example.com/subscribe method=" post " id="subscribe-form " name="subscribe-form " class="validate " target="_blank " novalidate=" ">
        <div id="signup_scroll ">
            <label for="mce-EMAIL ">Get email updates from..</label>
            <input type="email " value=" " name="EMAIL " class="email " id="EMAIL " placeholder="email address " required=" ">
            <div style="position: absolute; left: -5000px; " aria-hidden="true "><input type="text " name="b_11 " tabindex="-1 " value=" "></div>
            <div class="clear "><input type="submit " value="Subscribe " name="subscribe " id="-subscribe " class="button "></div>
        </div>
    </form>
</div>

Я могу добиться этого, используя синтаксис XPath: [not(contains(@id,'bottom'))] + [not(contains(text(),'P3'))] + [not(contains(text(),'AP'))] et c Однако основная проблема заключается в том, что вместо сопоставления всех желаемые дочерние элементы как один элемент - теперь он соответствует каждому элементу как WebElement List.

Прямо сейчас единственный способ извлечь нужный текст - это перебрать список веб-элементов и объединить результаты в одну строку S enter code here.

Можно напрямую очистить все желаемый контент за один раз (с одним вызовом element.getText()) без необходимости перебирать список элементов?

Спасибо

1 Ответ

0 голосов
/ 12 февраля 2020

Из вашего описания похоже, что все, что вам нужно, это текст из P-тегов с парой исключений. Селектор CSS div.td-post-content > p предоставит вам все P-теги, включая те, которые вы хотите исключить. Вы можете собрать их в список, а затем удалить текст, который вы хотите исключить, чтобы получить окончательный список.

List<WebElement> ps = driver.findElements(By.cssSelector("div.td-post-content > p"));
List<String> text = ps.stream().map(e -> e.getText()).collect(Collectors.toList());
text.remove("AP");
text.remove("P3");
System.out.println(text);

Запуск этой печати

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