【问题标题】:Parse HTML in Scala在 Scala 中解析 HTML
【发布时间】:2012-08-18 07:21:29
【问题描述】:

任务: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 函数中的“提要”是否为我提供了正确的解析格式,或者有更好的方法来实现吗? Feed 还给我根节点,对吧?

提前致谢

【问题讨论】:

  • 将 HTML 解析为 XML 绝不是一个好主意。为此目的,有一些不错的 Java 库。 Jsoup 就是其中之一。
  • @NikitaVolkov:这就是提问者使用 TagSoup 解析器的原因,它为非 XML HTML 提供了一个很好的 SAX 接口。
  • @TravisBrown 哦,好的。没注意到

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


【解决方案1】:

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

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

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

其中\\ 是一个选择器方法,大致相当于XPath 的//——即,它返回名为bodynode 的所有后代。如果您知道body 是根节点的子节点(而不是更深的后代),HTML 可能就是这种情况,您可以使用\ 而不是\\

【讨论】:

  • 感谢 travis :)。我可以问一个额外的问题......有没有办法给我像树一样的层次结构中的所有节点?我必须这样做递归还是有其他方法?我的意思是 html -head -body --div1 --div2 Thx 提前
  • 我不确定我是否理解这个问题。 Node(或者更具体地说是Elem)确实给了你一棵树——它有一个child 方法来返回它的孩子,尽管使用选择器来导航树通常更容易。
猜你喜欢
  • 2010-12-14
  • 2015-04-10
  • 1970-01-01
  • 2018-09-04
  • 2012-07-10
  • 2019-05-20
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多