1 回答

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊
給定 HTML:
<a href="http://example.com/1">Go to <b>example</b> 1</a>
<p>Some para text</p>
<a href="http://example.com/2">Go to <b>example</b> 2</a>
你只期待文字嗎?
Go to example 1
Go to example 2
您期望內(nèi)部 HTML 嗎?
Go to <b>example</b>example 1
Go to <b>example</b>example 2
或者,你期待別的嗎?
以下程序僅提供文本或內(nèi)部 HTML。每次找到錨節(jié)點(diǎn)時(shí),它都會(huì)保存該節(jié)點(diǎn),然后繼續(xù)沿著該節(jié)點(diǎn)的樹(shù)向下移動(dòng)。當(dāng)它遇到其他節(jié)點(diǎn)時(shí),它會(huì)檢查保存的節(jié)點(diǎn)并附加 TextNodes 的文本或?qū)⒐?jié)點(diǎn)的 HTML 呈現(xiàn)到緩沖區(qū)。最后,在遍歷所有子節(jié)點(diǎn)并重新遇到保存的錨節(jié)點(diǎn)后,它打印文本字符串和 HTML 緩沖區(qū),重置兩個(gè)變量,然后將錨節(jié)點(diǎn)置零。
我想到了使用緩沖區(qū)和 html.Render,并保存特定節(jié)點(diǎn),從Golang 解析 HTML,提取帶有標(biāo)簽的所有內(nèi)容。
以下內(nèi)容也在Playground中:
package main
import (
"bytes"
"fmt"
"io"
"strings"
"golang.org/x/net/html"
)
func main() {
s := `
<a href="http://example.com/1">Go to <b>example</b> 1</a>
<p>Some para text</p>
<a href="http://example.com/2">Go to <b>example</b> 2</a>
`
doc, _ := html.Parse(strings.NewReader(s))
var nAnchor *html.Node
var sTxt string
var bufInnerHtml bytes.Buffer
w := io.Writer(&bufInnerHtml)
var f func(*html.Node)
f = func(n *html.Node) {
if n.Type == html.ElementNode && n.Data == "a" {
nAnchor = n
}
if nAnchor != nil {
if n != nAnchor { // don't write the a tag and its attributes
html.Render(w, n)
}
if n.Type == html.TextNode {
sTxt += n.Data
}
}
for c := n.FirstChild; c != nil; c = c.NextSibling {
f(c)
}
if n == nAnchor {
fmt.Println("Text:", sTxt)
fmt.Println("InnerHTML:", bufInnerHtml.String())
sTxt = ""
bufInnerHtml.Reset()
nAnchor = nil
}
}
f(doc)
}
Text: Go to example 1
InnerHTML: Go to <b>example</b>example 1
Text: Go to example 2
InnerHTML: Go to <b>example</b>example 2
- 1 回答
- 0 關(guān)注
- 141 瀏覽
添加回答
舉報(bào)