我正在使用 Scala 和 Lift 框架开发网络应用程序。我在数据库中有记录,其中包含页面的 html perex
<b>Hi all, this is perex</b>
在一种情况下,我需要打印给用户这个 perex,但没有 html 标签。
Hi all, this is perex
在 Scala 中可以做到这一点吗?因为我试图用谷歌搜索,但没有成功。
感谢所有回复。
我正在使用 Scala 和 Lift 框架开发网络应用程序。我在数据库中有记录,其中包含页面的 html perex
<b>Hi all, this is perex</b>
在一种情况下,我需要打印给用户这个 perex,但没有 html 标签。
Hi all, this is perex
在 Scala 中可以做到这一点吗?因为我试图用谷歌搜索,但没有成功。
感谢所有回复。
如果字符串是有效的 XML,那么您可以使用:
scala.xml.XML.loadString("<b>Hi all, this is parex</b>").text
如果它不是有效的 XML,那么您可以使用scala.util.matching.Regex
HTML 解析库,例如http://jsoup.org/
我发现的最佳解决方案是使用cyberneko来解析您的字符串并进行一些“聪明”的SAX 事件处理。
即使您的 HTML 无效,cyberneko 也会解析您的 HTML,这是您可能在野外遇到的绝大多数 HTML 的情况。
如果您注册一个ContentHandler
基本上忽略除事件之外的所有character
事件并将它们附加到字符串构建器的自定义项,您将获得一个很好的初步近似值,但有一个烦人的缺陷:由块元素分隔的单词最终将连接起来(for<br/>example
=> forexample
)。
更好的解决方案是获取所有块元素的列表,并让您ContentHandler
收听startElement
事件。如果元素是块元素,只需将空格字符附加到您的字符串构建器。
请注意,虽然这似乎工作正常,但它可能不适合您的用例。<br/>
不是,例如,变成换行符。不过,如果需要,添加它应该不会有太多工作。
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)