package main import( "log" "net/http" "github.com/PuerkitoBio/goquery" "strconv" "strings" ) type chapter struct{ verses []string } type book struct{ chapters []chapter } func fetchChapter(book, searchedChapter, version string) (chapter, error){ url := "https://www.biblegateway.com/passage/?search=" + book + "%20" + searchedChapter +"&version=" + version res, err := http.Get(url) if err != nil { log.Printf("can’t get %s : %v\n", url, err) return chapter{}, err } defer res.Body.Close() if res.StatusCode != http.StatusOK { log.Printf("error code %v: %v\n", res.StatusCode, res.Status) return chapter{}, err } doc, err := goquery.NewDocumentFromReader(res.Body) if err != nil { log.Printf("error reading the http response: %v\n", err) return chapter{}, err } chapterText := chapter{} replacer := strings.NewReplacer( "L'Éternel", "YAHWEH", "l'Éternel", "YAHWEH", "Éternel", "YAHWEH", ) doc.Find(".verse > span").Each(func(i int, s *goquery.Selection){ /**********************************************************************************/ /**** verses are marked by an .verse class. Inside the text is in a span and *****/ /**** begin either by the chapter number (first verse), or by the verse *****/ /**** (the other verses). With that the code is straight forward. *****/ /**********************************************************************************/ rawText := s.Text() verse:= "" if i == 0 { verse, _ = strings.CutPrefix(rawText, searchedChapter ) }else{ verse, _ = strings.CutPrefix(rawText, strconv.Itoa(i+1)) } verse = replacer.Replace(verse) chapterText.verses = append(chapterText.verses, strings.TrimSpace(verse)) }) return chapterText, nil } /* func fecthBook (book, version string, chapterNumbers int) book, error{ failedChapter := 0 bookChapters := book{} for i:= 1 ; i > chapterNumbers ; i++{ verses, err := fetchChapter(book, strconv.Itoa(i), version) if err != nil { failedChapter++ log.Printf("%s", err) continue } book.chapters = append(book, } */