我之前已经能够使用 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/