java - 从 BR 标签中提取文本

标签 java selenium xpath

我之前已经能够使用 Selenium 提取文本,但是我在提取 < BR > 标签之间的数字时遇到了麻烦。这是 html 代码示例。

<DIV class="pagebodydiv">
    <TABLE  CLASS="datadisplaytable" SUMMARY="This table will display needed information." WIDTH="100%">
<TR>
<TD CLASS="nttitle" scope="colgroup" >Working Title</A></TD>
</TR>
<TR>
<TD CLASS="ntdefault">
 Further information on subject
<BR>
    3.000
<BR>
    2.000  
<BR>
<BR>
<BR>
<BR>
<BR>
More information
<BR>
<BR>
</TABLE>

到目前为止我已经尝试过使用:

WebElement creditinfo = driver.findElement(By.xpath("//div[@class='pagebodydiv']/text()[preceding-sibling::br]

Elements numInfo = doc.select("br");

但是,我不断遇到 NoSuchElementException 错误、InvalidSelectorException 错误,或者它只是不返回任何内容。关于如何获取信息有什么想法吗?

最佳答案

您实际上可以选择 <BR> 之间的文本节点标签。在 HTML(不是 XHTML)中,它们充当自关闭标签(如 <br/> )。基于该行为,您可以选择具有 <BR> 的所有文本节点。使用以下标记前后:

//TABLE[@CLASS='datadisplaytable']/TR/TD[@CLASS="ntdefault"]
/text()[preceding-sibling::node()[1][self::BR] 
        and following-sibling::node()[1][self::BR]]

这也会选择空白行和非数字的字 rune 本。

您可以删除空白节点,添加 [normalize-space(.) != '']到表达式的末尾(现在仅返回三个节点)。您可以使用表达式末尾的位置谓词( [1] 选择第一个节点。

下面的表达式选择包含值 2.000 的文本节点:

//TABLE[@CLASS='datadisplaytable']/TR/TD[@CLASS="ntdefault"]
/text()[preceding-sibling::node()[1][self::BR] 
        and following-sibling::node()[1][self::BR]][normalize-space(.) != ''][2]

注意:我假设您的源实际上具有大写的标签名称,因为在 XPath <TD> 中与 <td> 不同。我不确定 Selenium 在解析 HTML 时对此的容忍程度如何。

关于java - 从 BR 标签中提取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24289689/

相关文章:

java - 在带注释的 Controller Spring MVC 中使用 sessionAttribute

python - 如何使用 div 中的 id 和 class 在 selenium python 中查找元素

php - 在XPath评估之前,如何处理字符串中的双引号?

selenium - Xpath 不适用于 Selenium 中的 MouseOver(CatMenu)

python - mac 和 python 相对路径中的 Selenium chromedriver

.net - 使用 XPath(在 .NET 中)在两个标记之间选择(兄弟)

java - 从 Tomcat 的默认 server.xml 配置文件中删除默认用户数据库资源

java - 为什么使用 long literal 计算需要更多时间?

java - 如何验证基于 soap 的 Java Web 服务?

java - 需要帮助在 selenium webdriver 新打开的窗口中查找文本框