2013-11-22 51 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