我正在做一些HTML
刮痧。
我将HTML
页面转换为有效XML
使用HTMLCleaner
并从中提取数据<table>
我需要检查给定的<td>
是否有子节点,因为程序的流程在每种情况下都会有所不同。有没有hasChildren
等价的?我在文档中没有找到类似的东西。<td>
看起来像这样:
<td style="width: 1%; padding-right: 5px;">
</td>
找出它是否有任何子节点的最简单方法是什么?
我正在做一些HTML
刮痧。
我将HTML
页面转换为有效XML
使用HTMLCleaner
并从中提取数据<table>
我需要检查给定的<td>
是否有子节点,因为程序的流程在每种情况下都会有所不同。有没有hasChildren
等价的?我在文档中没有找到类似的东西。<td>
看起来像这样:
<td style="width: 1%; padding-right: 5px;">
</td>
找出它是否有任何子节点的最简单方法是什么?
其实org.htmlcleaner.TagNode
has方法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
像这样的东西应该工作:
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
我之前尝试做的没有成功是这样的:
node isEmpty
在这种情况下node
是我的。<td>
现在我所做的实际上是尝试获取我期望的第一级数据,看看它是否为空
node \\ "span" isEmpty
这给了我想要的结果。不知道这是否是最好的方法,但我将答案留在这里作为建议,以防没有人回答。