在Scala中解析HTML

时间:2012-08-22 19:51:11

标签: html xml scala xml-parsing html-parsing

任务:HTML - Scala中的解析器。我对scala很新。

到目前为止:我在Scala中编写了一个Parser来解析一个随机的html文档。

import scala.xml.Elem
import scala.xml.Node
import scala.collection.mutable.Queue
import scala.xml.Text
import scala.xml.PrettyPrinter

object Reader {
  def loadXML = {
    val parserFactory = new org.ccil.cowan.tagsoup.jaxp.SAXFactoryImpl
    val parser = parserFactory.newSAXParser()
    val source = new org.xml.sax.InputSource("http://www.randomurl.com")
    val adapter = new scala.xml.parsing.NoBindingFactoryAdapter
    val feed = adapter.loadXML(source, parser)
    feed
  }

  def proc(node: Node): String =
    node match {
      case <body>{ txt }</body> => "Partial content: " + txt
      case _ => "grmpf"
    }

  def main(args: Array[String]): Unit = {
    val content = Reader.loadXML
    Console.println(content)
    Console.println(proc(content))

  }
}
  1. 问题是“proc”不起作用。基本上,我想准确地获得一个节点的内容。或者是否有另一种方法可以在没有匹配的情况下实现这一目标?

  2. loadxml-function中的“feed”是否为我提供了正确的解析格式,还是有更好的方法来实现? Feed让我回到根节点,对吗?

  3. 提前致谢

1 个答案:

答案 0 :(得分:3)

你是对的:adapter.loadXML(source, parser)为你提供了根节点。问题是该根节点可能不会与body方法中的proc大小写匹配。即使根节点是body,它仍然不匹配,除非该元素只包含文本。

你可能想要更像这样的东西:

def proc(node: Node): String = (node \\ "body").text

其中\\是一个大致相当于XPath //的选择器方法 - 即,它返回名为node的{​​{1}}的所有后代。如果您知道body是根节点的子节点(而不是更深层次的后代)(可能是HTML的情况),则可以使用body而不是\。< / p>