猿问

如何在golang中有效地存储对文件的html响应

我正在尝试在 Golang 中构建一个爬虫。我正在使用net/http库从 url 下载 html 文件。我正在尝试保存http.resp并保存http.Header到文件中。

如何将这两个文件从各自的格式转换为字符串,以便将其写入文本文件。

我还看到了之前关于解析存储的 html 响应文件的问题。 在 Go 中解析来自文本文件的 HTTP 请求和响应。有没有办法以这种格式保存 url 响应。


缥缈止盈
浏览 150回答 3
3回答

aluckdog

Go 有一个带有响应转储的 httputil 包。 https://golang.org/pkg/net/http/httputil/#DumpResponse。响应转储的第二个参数是是否包含正文的布尔值。因此,如果您只想将标题保存到文件中,请将其设置为 false。将响应转储到文件的示例函数可能是:import (    "io/ioutil"    "net/http"    "net/http/httputil")func dumpResponse(resp *http.Response, filename string) error {    dump, err := httputil.DumpResponse(resp, true)    if err != nil {        return err    }    return ioutil.WriteFile(filename, dump, 0644)}

炎炎设计

编辑:感谢@JimB指向http.Response.Write方法,这使得这比我在开始时提出的要容易得多:resp, err := http.Get("http://google.com/")if err != nil{    log.Panic(err)}f, err := os.Create("output.txt")defer f.Close()resp.Write(f)这是我的第一个答案你可以这样做:resp, err := http.Get("http://google.com/")body, err := ioutil.ReadAll(resp.Body)// write whole the bodyerr = ioutil.WriteFile("body.txt", body, 0644)if err != nil {    panic(err)}这是对我的第一个答案的编辑:感谢添加标题部分的@Hector Correa。这是一个更全面的片段,针对您的整个问题。这将标题后跟请求正文写入 output.txt//get the responseresp, err := http.Get("http://google.com/")//bodybody, err := ioutil.ReadAll(resp.Body)//headervar header stringfor h, v := range resp.Header {    for _, v := range v {        header += fmt.Sprintf("%s %s \n", h, v)    }}//append all to one slicevar write []bytewrite = append(write, []byte(header)...)write = append(write, body...)//write it to a fileerr = ioutil.WriteFile("output.txt", write, 0644)if err != nil {    panic(err)}

白衣非少年

您还可以从响应中获取标题,如下所示:for header, values := range resp.Header {    for _, value := range values {        log.Printf("\t\t %s %s", header, value)    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答