我想提取与XPath匹配的内容:.//*[contains (@class, 'post-content')]
但是我希望排除子节点:
1(包含文本:P3 或 AP
2(包含 id 的div = 底部
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'))]
等 但是,主要问题是不是将所有所需的子元素匹配为单个元素 - 它现在将每个元素匹配为WebElement List
。
目前,提取所需文本的唯一方法是遍历 Web 元素列表并将结果连接成单个 Senter code here
tring。
是否可以一次直接抓取所有需要的内容(只需一次调用element.getText()
(,而无需遍历元素列表?
谢谢
从您的描述来看,您似乎只需要来自 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]