选择文本所需的 XPath 建议

Posted

技术标签:

【中文标题】选择文本所需的 XPath 建议【英文标题】:XPath suggestion needed to select text 【发布时间】:2017-08-09 11:21:58 【问题描述】:

我有一个带有以下 html 代码的 html 文档:

<!DOCTYPE html>
<html>
<head>
    <title>page XYZ</title>
</head>

<body>
<p><b>bold text</b> some more text </p>
    
    <p><b>1.</b>&nbsp;hello<br><b>2.</b>&nbsp;how<br><b>3.</b>&nbsp;do you do?</p><p>some more text in a paragraph.</p>   
    </body>
</html>

我需要编写 XPath 来打印 3 个点及其文本,即,

1. hello
2. how
3. do you do?

到目前为止我已经尝试过这个:(但它没有打印文本)

    List<WebElement> list = driver.findElements(By.xpath("//p/following-sibling::p/b"));

    for (int i = 0; i < list.size(); i++) 

        WebElement el = list.get(i);
        String text = el.getText();
        System.out.println(text);

请给我建议。

【问题讨论】:

【参考方案1】:

要仅选择文本,您应该使用//p[2]/text() 如果你需要打印 1. 2. 3. 你应该使用p[2]/b 如果你需要同时选择你应该使用 //p[2] 作为没有.findElements() 的字符串,然后在您的代码中将其拆分为列表

【讨论】:

//p[2] 有效(所以我接受你的回答),但同样在 Selenium 中,在 XPath 表达式中使用 text() 函数会引发错误,因为选择器无效。【参考方案2】:

使用 xpath "(//p[2])/text()" 将返回兄弟&lt;p&gt; 标签内的文本。使用 xpath "(//p[2])/b" 获取粗体数字 1、2、3。

要获得所需的输出,您可以尝试以下操作:

List<WebElement> numberList = driver.findElements(By.xpath("(//p[2])/b"));
List<WebElement> textList = driver.findElements(By.xpath("(//p[2])/text()"));

for(int i = 0; i < textList.size() && i < numberList.size(); i++) 
    System.out.println(numberList.get(i).getText() + " " + textList.get(i).getText());

【讨论】:

感谢您的回复。 XPath 表达式“(//p[2])/text()”只能作为 XPath 正常工作,但在 Selenium 中它会抛出错误:InvalidSelectorError。

以上是关于选择文本所需的 XPath 建议的主要内容,如果未能解决你的问题,请参考以下文章

XPath详解

无法提取所需的文本部分并从某些元素中删除其余部分

从文本中删除所需的内容

在 tinyMCE 中自定义 HTML 文本所需的帮助

添加警报以使用 jquery 制作所需的文本框

如何从图像中提取所需的文本部分,而不是使用 OCR 提取图像中的所有文本?