Golang Go语言中求教使用 Golang 替换 html 的标签里的内容

直接上想要达到的效果吧;

替换前内容:

<h1>h1.1</h1><h1>h1.2</h1><div>div1<span>span1</span></div>

希望替换后内容:

<h1>Replace_h1.1</h1><h1>Replace_h1.2</h1><div>Replace_div1<span>Replace_span1</span></div>

目前楼主使用了PuerkitoBio/goquery可以实现基本功能,但是缺点是会自行补充html标签,例如:

// 使用 goquery 替换的效果 fmt.Println(doc.Html())
<html><head></head><body><h1>Replace_h1.1</h1><h1>Replace_h1.2</h1><div>Replace_div1<span>Replace_span1</span></div></body></html>

<html><head></head><body>这些标签是楼主并不想要的?

求大佬们解惑。

有什么办法可以避免这种标签补全呢?或者有其他方案或者其他包可以实现。


Golang Go语言中求教使用 Golang 替换 html 的标签里的内容

更多关于Golang Go语言中求教使用 Golang 替换 html 的标签里的内容的实战教程也可以访问 https://www.itying.com/category-94-b0.html

14 回复

正则表达式不简单吗

更多关于Golang Go语言中求教使用 Golang 替换 html 的标签里的内容的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感觉正则可以实现,跟 go 没关系

我的建议是使用 goquery 替换后,再使用正则把<html><head></head><body>和</body></html>这段去掉

如果没有一个包可以用的话,我会选择用正则的,但是还是想以最快的方法实现这个功能。

楼上的 goquery

"github.com/antchfx/htmlquery"

获取到的 doc 对象进行操作,不像要的可以把 node 找到后删除。

h1 找到后 是个 list 。然后循环的进行替换

for index,nodeH1 :=range. xxx {
if nodeH1!=nil {
origin :=htmlquery.htmlquery.InnerText
//根据某种要求进行替换。然后回写
}
}

不能先取到 body 再 get html 吗?

需要替换的字符串没有 body 哦。

从结果来看是那个库自己加上了 body 吧?

这不就是个 xml 吗?

我直接用正则吧,貌似没有合适的库。

是的,这个库自己补全这些标签,所以不太符合我希望达到的效果,我还是用正则吧~

go template 试试?

在Go语言中,替换HTML标签里的内容通常涉及到解析HTML文档、修改元素内容并重新生成HTML字符串的过程。你可以使用golang.org/x/net/html包来解析和操作HTML文档。以下是一个简单的示例,演示如何替换HTML标签内的内容:

  1. 引入必要的包

    import (
        "golang.org/x/net/html"
        "strings"
        "bytes"
        "fmt"
    )
    
  2. 解析HTML并替换内容

    func replaceTagContent(htmlStr, tagName, newContent string) (string, error) {
        doc, err := html.Parse(strings.NewReader(htmlStr))
        if err != nil {
            return "", err
        }
        var f func(*html.Node)
        f = func(n *html.Node) {
            if n.Type == html.ElementNode && n.Data == tagName {
                n.FirstChild = nil // 清空现有内容
                n.AppendChild(html.NewNode(html.TextNode, newContent))
            }
            for c := n.FirstChild; c != nil; c = c.NextSibling {
                f(c)
            }
        }
        f(doc)
        var buf bytes.Buffer
        html.Render(&buf, doc)
        return buf.String(), nil
    }
    
    func main() {
        html := "<div>Old Content</div>"
        newHtml, _ := replaceTagContent(html, "div", "New Content")
        fmt.Println(newHtml)
    }
    

这段代码定义了一个函数replaceTagContent,它接受HTML字符串、标签名和新内容作为参数,并返回替换后的HTML字符串。

回到顶部