2013-02-26 9 views
6
package main 

import (
    "bytes" 
    "code.google.com/p/go.net/html" 
    "fmt" 
    "log" 
    "strings" 
) 

func main() { 
    s := "Blah. <b>Blah.</b> Blah." 
    n, err := html.Parse(strings.NewReader(s)) 
    if err != nil { 
     log.Fatalf("Parse error: %s", err) 
    } 
    var buf bytes.Buffer 
    if err := html.Render(&buf, n); err != nil { 
     log.Fatalf("Render error: %s", err) 
    } 
    fmt.Println(buf.String()) 
} 

Çıktı:html.Parse kullanmak için herhangi bir yolu 'iyi oluşturulmuş bir ağaç' yapmak için düğümleri eklemeden?

<html><head></head><body>Blah. <b>Blah.</b> Blah.</body></html> 

parçaları dışında bir belge yapmaktan html.Parse durdurmak için bir yol (yani önlemek <html> ekleyerek <body> vs.) var mı? Ben html.ParseFragment farkındayım ama aynı davranışı sergiliyor gibi görünüyor.

Sen <span> sonra aşağıdaki gibi bir şey yapıyor gibi bir ebeveyn eleman ile ayrıştırılması metni sararak etrafında alabilirsiniz:

n = n.FirstChild.LastChild.FirstChild 

ama az söylemek, iyi, kludgy görünüyor.

İdeal olarak şunları yapmak istiyorum: girdiyi girin, içindeki düğümleri kaldırın veya kaldırın ve sonuç eksik bir belge olsa bile sonucu bir dizeye yazın.

+1

Not varlığı [ 'goquery'] (https://github.com/PuerkitoBio/goquery) yapmak istediğiniz görevler için kullanışlı olabilir. – nemo

+0

Teşekkür ederim, ve tamlık için, geçmişte kullandığım Jeremy'nin [go-html-transform] (https://code.google.com/p/go-html-transform) bir kez daha bahsedeceğim. Ben exp/html (şimdi go.net/html) ile 1.2'den beri standart kütüphaneye girmesi muhtemel görünüyor, ancak bu üçüncü parti projeleri de ortaya çıkıyor görmek için iyi gelmeye çalışıyorum. –

cevap

9

ParseFragment öğesine bir bağlam sağlamanız gerekir. Aşağıdaki programı orijinal metni yazdırır:

package main 

import (
    "bytes" 
    "code.google.com/p/go.net/html" 
    "code.google.com/p/go.net/html/atom" 
    "fmt" 
    "log" 
    "strings" 
) 

func main() { 
    s := "Blah. <b>Blah.</b> Blah." 
    n, err := html.ParseFragment(strings.NewReader(s), &html.Node{ 
     Type:  html.ElementNode, 
     Data:  "body", 
     DataAtom: atom.Body, 
    }) 
    if err != nil { 
     log.Fatalf("Parse error: %s", err) 
    } 
    var buf bytes.Buffer 
    for _, node := range n { 
     if err := html.Render(&buf, node); err != nil { 
      log.Fatalf("Render error: %s", err) 
     } 
    } 
    fmt.Println(buf.String()) 
} 
+1

Teşekkürler! Bağlamı kullanmaya çalışmıştım, ama açıkça bir şeyleri berbat ettim. Bu sadece aradığım şey. –

+0

Bunun için teşekkürler, 4 yıl sonra. –

İlgili konular