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

आउटपुट:एचटीएमएल का उपयोग करने का कोई भी तरीका। बिना किसी 'अच्छी तरह से बने पेड़' बनाने के लिए नोड्स जोड़ने के बिना?

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

वहाँ एक दस्तावेज खंडों के बाहर करने से html.Parse को रोकने के लिए एक तरह से (यानी बचने <html> जोड़ने <body> आदि) है? मुझे html.ParseFragment के बारे में पता है लेकिन ऐसा लगता है कि यह वही व्यवहार प्रदर्शित करता है।

आपको इसके चारों ओर पाठ लपेटकर एक माता पिता के तत्व के साथ पार्स किया जा सकता जैसे <span> उसके बाद निम्न की तरह कुछ कर रही द्वारा प्राप्त कर सकते हैं:

n = n.FirstChild.LastChild.FirstChild 

लेकिन यह है कि कम से कम कहने के लिए, लगता है अच्छी तरह से, kludgy।

आदर्श रूप से मैं यह करना चाहता हूं: इसमें शामिल नोड्स इनपुट, हेरफेर या निकालें, और परिणाम को एक स्ट्रिंग पर वापस लिखें, भले ही परिणाम एक अपूर्ण दस्तावेज़ हो।

+1

नोट के अस्तित्व [ 'goquery'] (https://github.com/PuerkitoBio/goquery) जो कार्य आप करना चाहते हैं के लिए आसान हो सकता है। – nemo

+0

धन्यवाद, और पूर्णता के लिए मैं फिर से जेरेमी का [गो-एचटीएमएल-ट्रांसफॉर्म] (https://code.google.com/p/go-html-transform) का उल्लेख करूंगा जिसका मैंने पहले उपयोग किया था। मैं एक्सपी/एचटीएमएल (अब go.net/html) के साथ पकड़ने की कोशिश कर रहा हूं, जो इसे संस्करण 1.2 के आसपास मानक लाइब्रेरी में बनाने की संभावना है, लेकिन इन तृतीय पक्ष परियोजनाओं को उभरने के लिए भी अच्छा लगता है। –

उत्तर

9

आपको ParseFragment को संदर्भ प्रदान करने की आवश्यकता है। निम्नलिखित कार्यक्रम मूल पाठ बाहर प्रिंट:

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

धन्यवाद! मैंने संदर्भ का उपयोग करने की कोशिश की थी, लेकिन स्पष्ट रूप से मैंने कुछ खराब कर दिया। यह ठीक वही है जिसकी तलाश मुझे थी। –

+0

इसके लिए धन्यवाद, 4 साल बाद। –

5

आप http://godoc.org/code.google.com/p/go.net/html#ParseFragment चाहते हैं। अपने संदर्भ के रूप में एक नकली शरीर तत्व में गुजरें और टुकड़े को आपके टुकड़े में केवल तत्वों के टुकड़े के रूप में वापस कर दिया जाएगा।

आप go-html-transform के go.net/html wrapper पैकेज के लिए आंशिक * फ़ंक्शंस में एक उदाहरण देख सकते हैं। https://code.google.com/p/go-html-transform/source/browse/h5/h5.go#32

+0

धन्यवाद! बहुत सराहना की। –