9

我正在使用 Scala 和 Lift 框架开发网络应用程序。我在数据库中有记录,其中包含页面的 html perex

<b>Hi all, this is perex</b>

在一种情况下,我需要打印给用户这个 perex,但没有 html 标签。

Hi all, this is perex

在 Scala 中可以做到这一点吗?因为我试图用谷歌搜索,但没有成功。

感谢所有回复。

4

3 回答 3

8

如果字符串是有效的 XML,那么您可以使用:

scala.xml.XML.loadString("<b>Hi all, this is parex</b>").text

如果它不是有效的 XML,那么您可以使用scala.util.matching.RegexHTML 解析库,例如http://jsoup.org/

于 2011-03-22T14:44:08.217 回答
0

我发现的最佳解决方案是使用cyberneko来解析您的字符串并进行一些“聪明”的SAX 事件处理。

即使您的 HTML 无效,cyberneko 也会解析您的 HTML,这是您可能在野外遇到的绝大多数 HTML 的情况。

如果您注册一个ContentHandler基本上忽略除事件之外的所有character事件并将它们附加到字符串构建器的自定义项,您将获得一个很好的初步近似值,但有一个烦人的缺陷:由块元素分隔的单词最终将连接起来(for<br/>example=> forexample)。

更好的解决方案是获取所有块元素的列表,并让您ContentHandler收听startElement事件。如果元素是块元素,只需将空格字符附加到您的字符串构建器。

请注意,虽然这似乎工作正常,但它可能不适合您的用例。<br/>不是,例如,变成换行符。不过,如果需要,添加它应该不会有太多工作。

于 2016-01-04T10:50:28.340 回答
0

TagSoup应该满足您解析真实 html 文件的要求。

sbt 依赖,

libraryDependencies += "org.ccil.cowan.tagsoup" % "tagsoup" % "1.2.1"

示例代码,

object TagSoupXmlLoader {

  private val factory = new SAXFactoryImpl()

  def get(): XMLLoader[Elem] = {
    XML.withSAXParser(factory.newSAXParser())
  }
}

用法,

val root = TagSoupXmlLoader.get().load("http://www.google.com")
println(root)
于 2017-07-17T07:00:10.023 回答