2013-11-22 3 views
0

Я пытаюсь загрузить действительный html для обработки в Scala. Кажется, что преобразование в xml было бы хорошей отправной точкой. Это выглядит очень приятным кодом на несколько спорных scala.xml.Xhtml Scala core library для этого. В основном это должно влечь за собой «исправление» тегов, которые действительны в html, но не являются допустимыми xml и, следовательно, не позволяют документу быть действительным xhtml и немного больше. Вот код оттуда:Преобразование html в xhtml (действительный xml) в Scala

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('>') 
     } 
    } 
    } 

Что, кажется, принять какое-то чрезмерное упорство в поиске, как использовать эту функцию для существующего документа HTML, который был извлекаться с scala.io.Source(fromFile). Смысл типа Node кажется немного в базе кода, или я не уверен, как получить из строки, полученной от 0aот scala.io.Source, к чему-то, что может быть передано в вышеуказанную скопированную функцию toXhtml.

The scaladoc for this function, похоже, не разъясняет многое.

Существует также another related library, где в скайдакоке имеется только миллион записей.

Я был бы очень рад, если бы кто-нибудь мог сказать, как необработанную строку html можно преобразовать в «чистую» 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, о которой я упоминал, поскольку она настолько краткий ... поскольку я чувствую, что не имею ни малейшего представления о том, насколько либеральный или оригинальный может быть на входе, которого я еще не видел. Scala-код очень лаконичен, чтобы следовать .. только входной водопровод немного изворотливый. – matanster

Смежные вопросы