如何将 <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.
将此字符串拆分为您需要的内容
提取文本 TEXT1、TEXT2、TEXT3 和 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());
我正在尝试逐一获取名为 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.
将此字符串拆分为您需要的内容提取文本 TEXT1、TEXT2、TEXT3 和 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());