html - 在 Scala 中解析 HTML

标签 html xml scala xml-parsing html-parsing

任务:HTML - Scala 中的解析器。我对 Scala 很陌生。

到目前为止:我已经用 Scala 编写了一个小的解析器来解析一个随机的 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 返回根节点,对吧?

提前致谢

最佳答案

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

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

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

在哪里\\是一个选择器方法,大致等同于 XPath 的 // —即,它返回 node 的所有后代名为 body .如果你知道body是根节点的子节点(而不是更深的后代),HTML 可能就是这种情况,您可以使用 \而不是 \\ .

关于html - 在 Scala 中解析 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12080408/

相关文章:

xml - Powershell XML 属性命名空间

scala - 来自 Scala 反射的类型

java - 将一次性代码交换为刷新 token 时出现 Google OAuth redirect_uri_mismatch

jquery - 改变不同屏幕尺寸的动画

html - 页脚下方的额外空白

java - 如何在 GWT 中向客户端发送 XML 文档?

xml - 导入命名空间的 Eclipse WSDL 验证错误

scala - 如何将 Scala Spark Dataset.show 重定向到 log4j 记录器

javascript - 防止div碰撞

javascript - 不稳定的 jQuery 可拖动行为