2013-11-22 32 views
0

我试图在Scala中加载有效的html进行处理。看起来像转换到XML将是一个很好的起点。它看起来像很不错的代码在有点争议的scala.xml.Xhtml Scala core library这样做。基本上它应该包含“固定”标签,这些标签在html中是有效的,但不是有效的xml,因此防止文档成为有效的xhtml,并且只是更多。下面是从那里代码:在Scala中将html转换为xhtml(有效的xml)

def toXhtml(
    x: Node, 
    pscope: NamespaceBinding = TopScope, 
    sb: StringBuilder = new StringBuilder, 
    stripComments: Boolean = false, 
    decodeEntities: Boolean = false, 
    preserveWhitespace: Boolean = false, 
    minimizeTags: Boolean = true): Unit = 
    { 
    def decode(er: EntityRef) = XhtmlEntities.entMap.get(er.entityName) match { 
     case Some(chr) if chr.toInt >= 128 => sb.append(chr) 
     case _        => er.buildString(sb) 
    } 
    def shortForm = 
     minimizeTags && 
     (x.child == null || x.child.length == 0) && 
     (minimizableElements contains x.label) 

    x match { 
     case c: Comment      => if (!stripComments) c buildString sb 
     case er: EntityRef if decodeEntities => decode(er) 
     case x: SpecialNode     => x buildString sb 
     case g: Group       => 
     g.nodes foreach { toXhtml(_, x.scope, sb, stripComments, decodeEntities, preserveWhitespace, minimizeTags) } 

     case _ => 
     sb.append('<') 
     x.nameToString(sb) 
     if (x.attributes ne null) x.attributes.buildString(sb) 
     x.scope.buildString(sb, pscope) 

     if (shortForm) sb.append(" />") 
     else { 
      sb.append('>') 
      sequenceToXML(x.child, x.scope, sb, stripComments, decodeEntities, preserveWhitespace, minimizeTags) 
      sb.append("</") 
      x.nameToString(sb) 
      sb.append('>') 
     } 
    } 
    } 

什么似乎采取一些过度的毅力是找到如何使用该功能已获取与scala.io.Source(fromFile)现有的HTML文档。 Node类型的含义在代码库中似乎有点elusive,或者我不确定如何从scala.io.Source的fromFile接收到的字符串获取某些可以输入到上述复制函数toXhtml中的字符串。

The scaladoc for this function似乎没有太多说明。

还有another related library其中scaladoc中只有zillion条目。

如果有人能说如何将一个原始的html字符串转换为'clean'xhtml使用这个库,并且通过如何从the source code中推导出来,因为我的Scala可能不是那么好请参阅..

回答

2

您可能会考虑使用jsoup,因为它擅长处理凌乱的真实世界的HTML。它也可以根据允许标记的白名单来清理HTML。一个例子:

import org.jsoup.Jsoup 
import org.jsoup.safety.Whitelist 
import scala.collection.JavaConversions._ 
import scala.io.Source 

object JsoupExample extends App { 
    val suspectHtml = Source.fromURL("http://en.wikipedia.org/wiki/Scala_(programming_language)").mkString 
    val cleanHtml = Jsoup.clean(suspectHtml, Whitelist.basic) 
    val doc = Jsoup.parse(cleanHtml) 
    doc.select("p").foreach(node => println(node.text)) 
} 
+0

是的,我只是希望有一个纯粹的Scala解决方案,我可以快速理解代码并在必要时进行更改。我可能会采用我提到的Scala函数,因为它非常简洁......因为我觉得我几乎不知道自由或原创可能会对我还没有看到的投入产生什么样的影响。斯卡拉代码非常简洁,只有它的输入管道有点狡猾。 – matanster