如何确定Node是否有子节点

时间:2013-10-09 13:49:35

标签: xml scala xpath

我正在进行一些HTML抓取。

我使用HTMLCleanerHTML页面转换为有效XML,并从<table>

中提取数据

我需要检查给定的<td>是否有子节点,因为在每种情况下程序的流程都不同。有没有hasChildren等价物?我没有在文档中找到类似的东西。 <td>看起来像这样:

<td style="width: 1%; padding-right: 5px;">
</td>

找出它是否有任何子节点的最简单方法是什么?

3 个答案:

答案 0 :(得分:2)

实际上org.htmlcleaner.TagNode有方法public boolean hasChildren()。在你的情况下,如果'td'有孩子,它将返回:

import org.htmlcleaner._
val cleaner:HtmlCleaner  = new HtmlCleaner()
val html = """
             |<html>
             |
             |<head />
             |
             |<body>
             |      <table>
             |          <tbody>
             |              <tr>
             |                  <td style="width: 1%; padding-right: 5px;"></td>
             |              </tr>
             |          </tbody>
             |      </table>
             |  </body>
             |</html>
           """.stripMargin

    val td = cleaner.clean(html).findElementByName("td", true)
    td.hasChildren  //returns false

答案 1 :(得分:2)

这样的事情应该有效:

import scala.xml._
def isEmpty(node: Node) = node.child. // All children
  // Filter out empty text nodes
  filter {childNode => !childNode.isInstanceOf[Text] || !childNode.text.trim.isEmpty}.
  isEmpty

在REPL中:

scala> import scala.xml._
import scala.xml._

scala> def isEmpty(node: Node) = node.child. // All children
     |       // Filter out empty text nodes
     |       filter {childNode => !childNode.isInstanceOf[Text] || !childNode.text.trim.isEmpty}.
     |       isEmpty
isEmpty: (node: scala.xml.Node)Boolean

scala> val emptyTd = <td style="width: 1%; padding-right: 5px;">
     | </td>
emptyTd: scala.xml.Elem = 
<td style="width: 1%; padding-right: 5px;">
</td>

scala> val nonEmptyTd1 = <td style="width: 1%; padding-right: 5px;">
     | Lorem ipsum
     | </td>
nonEmptyTd1: scala.xml.Elem = 
<td style="width: 1%; padding-right: 5px;">
Lorem ipsum
</td>

scala> val nonEmptyTd2 = <td style="width: 1%; padding-right: 5px;">
     | <br />
     | </td>
nonEmptyTd2: scala.xml.Elem = 
<td style="width: 1%; padding-right: 5px;">
<br/>
</td>

scala> isEmpty(emptyTd)
res0: Boolean = true

scala> isEmpty(nonEmptyTd1)
res1: Boolean = false

scala> isEmpty(nonEmptyTd2)
res2: Boolean = false

答案 2 :(得分:1)

在没有成功之前我试图做的是:

node isEmpty
在这种情况下,node是我的<td>

现在我所做的实际上是尝试获取我期望的第一级数据,看看它是否为空

node \\ "span" isEmpty

这给了我想要的结果。不知道这是否是最好的方法,但我在这里留下答案作为建议,以防没有人回答。