从BR​​标签中提取文本

时间:2014-06-18 15:36:42

标签: 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错误,或者它只是没有返回任何内容。关于如何获取信息的任何想法?

3 个答案:

答案 0 :(得分:4)

您实际上可以选择<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]]

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

您可以删除空表空间节点,在表达式的末尾添加[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>不同。在解析HTML时,我不确定Selenium对此有多宽容。

答案 1 :(得分:1)

这可能会有所帮助:

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

   for(int i=0;i<rows.size();i++)
   {
     WebElement column = tbody.findElement(By.xpath("//table[@class='datadisplaytable']/tbody/tr[2]/td"));
     if(column.getText().trim().contains("."))
     {
        System.out.println("text : "+column.getText().trim());
        list.add(column.getText().trim());
     }

   }

答案 2 :(得分:0)

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