gpt4 book ai didi

json - 将 colly 包输出文本添加到 golang 中的映射

转载 作者:行者123 更新时间:2023-12-05 05:31:04 25 4
gpt4 key购买 nike

我正在用 colly 包制作一个网络抓取工具,它从网站收集 ContestNameContestTime 并制作一个 json 文件。

所以我喜欢这个


Contests := make(map[string]map[string]map[string]map[string]string)

Contests["AtCoder"] = make(map[string]map[string]map[string]string)
Contests["AtCoder"]["FutureContests"] = make(map[string]map[string]string)

AtcoderFunc(Contests)


.................code..........

func AtcoderFunc(Contests map[string]map[string]map[string]map[string]string) {
collector := colly.NewCollector(
colly.AllowedDomains("atcoder.jp", "www.atcoder.jp"),
)

// loc, _ := time.LoadLocation("Asia/Calcutta")
// format := "2006-01-02 15:04:05"
// var i int
format := "2006-01-02 15:04:05-0700"
loc, _ := time.LoadLocation("Asia/Calcutta")


for i := 1; i < 10; i++ {
ContestSelTime := fmt.Sprintf("#contest-table-upcoming div div table tbody tr:nth-child(%d) td:nth-child(1) a", i+1)
ContestSelName := fmt.Sprintf("#contest-table-upcoming div div table tbody tr:nth-child(%d) td:nth-child(2)", i)

// for contest name
collector.OnHTML(ContestSelName, func(element *colly.HTMLElement) {
ContestName := element.ChildText("a")
fmt.Printf("%T \n", ContestName)
fmt.Println(ContestName) // instead of printing i want to add it to the Contests["AtCoder"]["FutureContests"] map and print like json


})

// for contestTime
collector.OnHTML(ContestSelTime, func(element *colly.HTMLElement) {
ContestStartTime := element.ChildText("time")
parsed_time, _ := time.Parse(format, ContestStartTime)
IST_time := parsed_time.In(loc)
fmt.Println("Time in IST", IST_time) // instead of printing i want to add it to the Contests["AtCoder"]["FutureContests"] map.
})

}

collector.OnRequest(func(request *colly.Request) {
fmt.Println("Visiting", request.URL.String())
})

collector.Visit("https://atcoder.jp/contests")

}


有什么想法吗?我尝试像这样将值添加到 map

            Contests["AtCoder"]["FutureContests"] = map[string]string{
"Name": string(ContestName),
}

我想做这样的json

{
"AtCoder": {
"FutureContests": {
"1": {
"Name": "Contest name",
"Start": "time here"
},
"2": {
"Name": "Contest name",
"Start": "time here"
}
}
}
}

但它给出错误 cannot use (map[string]string literal) (value of type map[string]string) as map[string]map[string]string value in assignment

有什么想法吗?

最佳答案

错误在 map 分配中。管理如此嵌套的结构非常困难,但我找到了成功处理它的方法。让我展示代码:

package main

import (
"encoding/json"
"fmt"
"strconv"
"time"

"github.com/gocolly/colly/v2"
)

type contest struct{}

func AtcoderFunc(contests map[string]map[string]map[string]string) {
collector := colly.NewCollector(
colly.AllowedDomains("atcoder.jp", "www.atcoder.jp"),
)

format := "2006-01-02 15:04:05-0700"
loc, _ := time.LoadLocation("Asia/Calcutta")

contests["UpcomingContest"] = make(map[string]map[string]string)

for i := 1; i < 3; i++ {
rawI := strconv.Itoa(i)
contests["UpcomingContest"][rawI] = make(map[string]string)

contestSelTime := fmt.Sprintf("#contest-table-upcoming div div table tbody tr:nth-child(%d) td:nth-child(1) a", i+1)
contestSelName := fmt.Sprintf("#contest-table-upcoming div div table tbody tr:nth-child(%d) td:nth-child(2)", i)

// for contest name
collector.OnHTML(contestSelName, func(element *colly.HTMLElement) {
contestName := element.ChildText("a")
contests["UpcomingContest"][rawI]["Name"] = contestName
})

// for contestTime
collector.OnHTML(contestSelTime, func(element *colly.HTMLElement) {
ContestStartTime := element.ChildText("time")
parsed_time, _ := time.Parse(format, ContestStartTime)
IST_time := parsed_time.In(loc)
contests["UpcomingContest"][rawI]["Time"] = fmt.Sprint(IST_time)
})
}

collector.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})

collector.Visit("https://atcoder.jp/contests")
}

func main() {
contests := make(map[string]map[string]map[string]map[string]string)
contests["AtCoder"] = make(map[string]map[string]map[string]string)

AtcoderFunc(contests["AtCoder"])

data, _ := json.MarshalIndent(contests, "", " ")
fmt.Println(string(data))
}

或多或少我保留了你的结构。除了解决这个问题之外,我通过更改一些名称并删除未使用的语句来稍微重构了您的示例。最后,我使用了 MarshalIndent 函数来美化打印到终端上的 JSON 字符串。
让我知道是否也适合您!

关于json - 将 colly 包输出文本添加到 golang 中的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74445600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com