2013-02-26 2 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()) 
} 

wyjściowa:Jakikolwiek sposób użycia html.Parse bez dodawania węzłów do "dobrze uformowanego drzewa"?

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

Czy istnieje sposób, aby zatrzymać html.Parse dokonywania dokumentu z fragmentów (tj unikać dodawania <html>, <body> itd.)? Jestem świadomy html.ParseFragment, ale wygląda na to samo zachowanie.

można obejść poprzez owinięcie tekst, aby być analizowany z elementu nadrzędnego, takie jak <span> potem robić coś jak poniżej:

n = n.FirstChild.LastChild.FirstChild 

ale wydaje się, że dobrze, kludgy do powiedzenia najmniej.

Idealnie chciałbym: zaakceptować dane wejściowe, manipulować lub usunąć węzły znajdujące się w nim i zapisać wynik z powrotem do ciągu, nawet jeśli wynik jest niekompletny.

+1

zanotować istnienia od [ 'goquery'] (https://github.com/PuerkitoBio/goquery), które mogą być przydatne dla zadań, które chcesz zrobić. – nemo

+0

Dziękuję, a dla kompletności wymienię ponownie Jeremy'ego [go-html-transform] (https://code.google.com/p/go-html-transform), z którego korzystałem w przeszłości. Próbuję poradzić sobie z exp/html (teraz go.net/html), który prawdopodobnie wejdzie w standardową bibliotekę wokół wersji 1.2 lub podobnej, ale dobrze jest też zobaczyć te projekty stron trzecich. –

Odpowiedz

9

Musisz podać kontekst do ParseFragment. Poniższy program wypisuje oryginalny tekst:

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

Dzięki! Próbowałem użyć kontekstu, ale wyraźnie coś spieprzyłem. Tego właśnie szukałem. –

+0

Dziękuję za to, 4 lata później. –