我正在进行一些HTML
抓取。
我使用HTMLCleaner
将HTML
页面转换为有效XML
,并从<table>
我需要检查给定的<td>
是否有子节点,因为在每种情况下程序的流程都不同。有没有hasChildren
等价物?我没有在文档中找到类似的东西。 <td>
看起来像这样:
<td style="width: 1%; padding-right: 5px;">
</td>
找出它是否有任何子节点的最简单方法是什么?
答案 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
这给了我想要的结果。不知道这是否是最好的方法,但我在这里留下答案作为建议,以防没有人回答。