从BR​​标签中提取文本

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

Working Title
Further information on subject
3.000
2.000




More information

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

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

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

但是,我一直遇到NoSuchElementException错误,InvalidSelectorException错误,或者它只是没有返回任何内容。 关于如何获取信息的任何想法?

您实际上可以选择
标记之间的文本节点。 在HTML(不是XHTML)中,它们充当自动关闭标签(如
)。 根据该行为,您可以选择在其之前和之后具有
标记的所有文本节点:

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

这将选择空白行和不是数字的字符文本。

您可以删除空的空间节点,在表达式的末尾添加[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

中与

。 在解析HTML时,我不确定Selenium对此有多宽容。

它可能有所帮助:

  WebElement table =driver.findElement(By.xpath("//table[@class='datadisplaytable']")); WebElement tbody=table.findElement(By.tagName("tbody")); List rows=tbody.findElements(By.tagName("tr")); System.out.println("Row size:"+rows.size()); ArrayList list=new ArrayList<>(); for(int i=0;i 

我认为BR不被视为封闭标签,因此您将无法提取“封闭文本”。 您可能必须提取TD CLASS="ntdefault"包含的文本,其中所有BR将被转换为换行符。 然后,您必须执行字符串操作才能仅提取您感兴趣的部分。