2

我正在做一些HTML刮痧。

我将HTML页面转换为有效XML使用HTMLCleaner并从中提取数据<table>

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

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

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

4

3 回答 3

2

其实org.htmlcleaner.TagNodehas方法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
于 2013-10-09T14:26:59.827 回答
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
于 2013-10-09T14:41:57.027 回答
1

我之前尝试做的没有成功是这样的:

node isEmpty

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

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

node \\ "span" isEmpty

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

于 2013-10-09T14:13:39.813 回答