如何将 <p> 和 span 标签之间的文本一一提取

How to extract the texts one by one between <p> and span tags

我正在尝试逐一获取名为 text1、text2、text3、text4 的文本。

<div class="element">
    <p><span>"TEXT1"</span></p>
    <p><span>"TEXT2"<br>"TEXT3"<br>"TEXT4"</span</p>
</div>

当我尝试将 div.element>p>span 与 css 选择器一起使用时,selenium 抛出空指针异常。

WebElement element = driver.findElement(By.cssSelector("div.element>p>span"));
String a = element.getText();
System.out.println("a : "+a);

我也试过用 for 循环获取它们,但没有用。你能帮帮我吗?

你能试试下面的方法吗"div > p> span"

首先尝试使用 xpath:

更改您的定位器
By.xpath("//*[@class='element']//p")

然后将它们收集在List中,使用循环并用断线将它们分开。

List<WebElement> elements = driver.findElements(By.xpath("//*[@class='element']//p"));

for(int i=0; i<elements.size(); i++) {
    WebElement p = elements.get(i);
    String lines[] = p.getText().split("\r?\n");
    for(String line: lines) {
        System.out.println("line :" +line);
    }
}

空指针异常意味着您正试图从不存在的元素中获取文本。所以你首先确保找到元素,然后尝试用它做一些事情。

此外,由于您的文本 div 由不同的标签标识,因此无法在此处编写通用循环。我建议您将 div 容器中的所有文本放在一个字符串中,其中它将是文本,div 由特殊符号标识,例如 /r/n 或其他。您可以使用 Regex.

将此字符串拆分为您需要的内容

提取文本 TEXT1TEXT2TEXT3 TEXT4一一可以用下面的:

  • TEXT1:

    System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='element']/p/span"))).getAttribute("innerHTML"););
    
  • TEXT2:

    System.out.println(((JavascriptExecutor)driver).executeScript('return arguments[0].firstChild.textContent;', new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='element']//following-sibling::p[2]")))).toString());
    
  • TEXT3:

    System.out.println(((JavascriptExecutor)driver).executeScript('return arguments[0].childNodes[3].textContent;', new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='element']//following-sibling::p[2]")))).toString());
    
  • TEXT4:

    System.out.println(((JavascriptExecutor)driver).executeScript('return arguments[0].lastChild.textContent;', new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='element']//following-sibling::p[2]")))).toString());