dtrovwl75780 2014-06-27 16:19
浏览 46
已采纳

如何在线查找包裹?

I'm trying to run a go program using LiteIDE x22 but I get the message

C:/Go/bin/go.exe build  [C:/Users/admins/Desktop/desktp/worm_scraper-master]
worm_scraper.go:11:2: cannot find package "github.com/codegangsta/cli" in any of:
    C:\Go\src\pkg\github.com\codegangsta\cli (from $GOROOT)
    C:\users\admins\gostuff\src\github.com\codegangsta\cli (from $GOPATH)
worm_scraper.go:12:2: cannot find package "github.com/puerkitobio/goquery" in any of:
    C:\Go\src\pkg\github.com\puerkitobio\goquery (from $GOROOT)
    C:\users\admins\gostuff\src\github.com\puerkitobio\goquery (from $GOPATH)
Error: process exited with code 1.

I think this means it's looking for it on my harddrive instead of online right? (btw I'm pretty clueless about programming just trying to something some else wrote) how to I get it to access the web? here's the full code

package main

import (
    "errors"
    "fmt"
    "os"
    "os/exec"
    "regexp"
    "strings"

    "github.com/codegangsta/cli"
    "github.com/puerkitobio/goquery"
)

const (
    MainSite        = "https://parahumans.wordpress.com/"
    TableOfContents = "https://parahumans.wordpress.com/table-of-contents/"
)

type Arc struct {
    Identifier string
    Title      string
    Chapters   []Chapter
}

type Chapter struct {
    Title      string
    Url        string
    Tags       []string
    Paragraphs []Paragraph
    Retries    int
    DatePosted string
}

type Paragraph string

// Format the paragraph
func (p *Paragraph) Format() {
    s := string(*p)

    // Handle emphasis
    s = strings.Replace(s, "<em>", "*", -1)
    s = strings.Replace(s, "</em>", "*", -1)
    s = strings.Replace(s, "<i>", "*", -1)
    s = strings.Replace(s, "</i>", "*", -1)

    // Handle bold
    s = strings.Replace(s, "<strong>", "**", -1)
    s = strings.Replace(s, "</strong>", "**", -1)
    s = strings.Replace(s, "<b>", "**", -1)
    s = strings.Replace(s, "</b>", "**", -1)

    // Remove new lines
    s = strings.Replace(s, "
", "", -1)

    // And random double spaces
    s = strings.Replace(s, ".  ", ". ", -1)

    *p = Paragraph(s)
}

// Return the Arc that the given chapter belongs to
func (ch *Chapter) WhichArc(arcList []*Arc) (*Arc, error) {
    for _, arc := range arcList {
        if strings.Replace(ch.Title[:2], ".", "", -1) == arc.Identifier {
            return arc, nil
        }
    }
    return &Arc{}, errors.New("chapter '" + ch.Title + "' did not match any Arcs")
}

// Parse a chapter and return it
func (ch *Chapter) Parse(done chan bool) {
    if ch.Retries > 3 {
        panic("Chapter url '" + ch.Url + "' has timed out too many times")
    }
    // Get the chapter
    if strings.HasPrefix(ch.Url, "http") == false {
        // Make sure it begins with http so goquery can use it
        ch.Url = "https://" + ch.Url
    }
    doc, err := goquery.NewDocument(ch.Url)
    if err != nil {
        // Try again
        ch.Retries++
        go ch.Parse(done)
        return
    }

    // Set the new chapter title
    ch.Title = doc.Find("h1.entry-title").Text()

    // Set the tags
    doc.Find(".entry-meta a[rel=tag]").Each(func(_ int, s *goquery.Selection) {
        ch.Tags = append(ch.Tags, s.Text())
        if len(ch.Tags) == 0 {
            ch.Tags = append(ch.Tags, "NONE")
        }
    })

    // Get the date it was posted
    ch.DatePosted = doc.Find("time.entry-date").Text()

    // Now we'll get all the paragraphs
    doc.Find(".entry-content > p").Each(func(_ int, s *goquery.Selection) {
        // Check for the previous/next links
        if len(s.Find("a").Nodes) > 0 {
            return
        }

        // Get the paragraph HTML
        st, _ := s.Html()
        para := Paragraph("")

        // Get the actual paragraph
        if val, exists := s.Attr("padding-left"); exists && val == "30px" {
            // Check to see if the paragraph is special (indented) block
            para = Paragraph("    " + st)
        } else if val, exists := s.Attr("text-align"); exists && val == "center" {
            // Otherwise check to see if it's a separator paragraph
            para = Paragraph("----------")
        } else {
            // It's just a normal paragraph in this case
            para = Paragraph(st)
        }

        // And add the paragraph to the chapter
        para.Format()
        ch.Paragraphs = append(ch.Paragraphs, para)
    })

    // Finally, let's signal a success
    done <- true
}

// Return a slice of Arcs extracted from the table of contents
func ParseArcs(s string) []*Arc {
    arcs := []*Arc{}
    r, _ := regexp.Compile(`[0-9]+`)
    for _, line := range strings.Split(s, "
") {
        line = strings.TrimSpace(line)
        if strings.HasPrefix(line, "Arc") {
            arcs = append(arcs, &Arc{
                Identifier: r.FindString(line),
                Title:      line,
            })
        } else if strings.HasPrefix(line, "Epilogue") {
            arcs = append(arcs, &Arc{
                Identifier: "E",
                Title:      line,
            })
        }
    }
    return arcs
}

func main() {
    // Define the app
    app := cli.NewApp()
    app.Name = "Worm Scraper"
    app.Usage = "A tool to let you get an updated EPUB copy of the serial web novel Worm, by Wildbow"
    app.Version = "1.0"
    app.Author = "Benjamin Harris"

    // Define the application flags
    app.Flags = []cli.Flag{
        cli.BoolFlag{"pdf", "Save the book as a PDF instead of an EPUB, if possible"},
        cli.BoolFlag{"with-link", "Include a link to the chapter online"},
        cli.BoolFlag{"with-tags", "Include the tags each chapter was posted under"},
        cli.BoolFlag{"with-date", "Include the date each chapter was posted"},
    }

    // The heart of the application
    app.Action = func(context *cli.Context) {
        // Starting the program
        fmt.Println("Starting to scrape Worm")

        // Get the list of arcs from the table of contents
        fmt.Println("Gathering links from table of contents...")
        contents, err := goquery.NewDocument(TableOfContents)
        if err != nil {
            panic("Failed to get the table of contents! " + err.Error())
        }

        // Parse the arcs
        arcs := ParseArcs(contents.Find(".entry-content").Text())

        // Now get the links for the arc chapters
        contents.Find(".entry-content a:not([class*=share-icon])").Each(func(_ int, s *goquery.Selection) {
            ch := Chapter{}
            ch.Title = strings.Replace(strings.TrimSpace(s.Text()), "
", "", -1)
            ch.Url, _ = s.Attr("href")

            if ch.Title == "" {
                return
            }

            arc, _ := ch.WhichArc(arcs)
            arc.Chapters = append(arc.Chapters, ch)
        })

        // Manually add missing chapter in Epilogue
        c := Chapter{
            Title: "E.2",
            Url:   "https://parahumans.wordpress.com/2013/11/05/teneral-e-2/",
        }
        a, _ := c.WhichArc(arcs)
        a.Chapters = append(a.Chapters, c)
        copy(a.Chapters[1+1:], a.Chapters[1:])
        a.Chapters[1] = c

        // Now start getting the chapters
        chapters := 0
        done := make(chan bool)
        for _, arc := range arcs {
            for i, _ := range arc.Chapters {
                chapters++
                go arc.Chapters[i].Parse(done)
            }
        }

        fmt.Println("Starting to parse", chapters, "chapters")
        fmt.Print("Finished: ")

        totalChapters := chapters
        for {
            select {
            case <-done:
                chapters--
                fmt.Print(totalChapters-chapters, ",")
            }
            if chapters == 0 {
                // We're done with all the chapters
                close(done)
                fmt.Println()
                break
            }
        }

        // And let's write all this stuff to a file now
        fmt.Println("Saving results to file...")
        f, err := os.OpenFile("Worm.md", os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666)
        if err != nil {
            panic(err)
        }
        defer f.Close()

        // Define pagebreak
        PageBreak := "

"

        // Write the cover
        f.WriteString("# Worm

")
        f.WriteString("By Wildbow

")
        f.WriteString("Website: " + MainSite)

        // Now loop through the Arcs
        for _, arc := range arcs {
            f.WriteString(PageBreak + "# " + arc.Title)
            for _, chapter := range arc.Chapters {
                f.WriteString("

")
                f.WriteString("## " + chapter.Title + "

")
                if context.Bool("with-tags") {
                    f.WriteString("**Tags:** " + strings.Join(chapter.Tags, ", ") + "  ")
                }
                if context.Bool("with-date") {
                    f.WriteString("**Date:** " + chapter.DatePosted + "  ")
                }
                if context.Bool("with-link") {
                    f.WriteString("**Link:** " + chapter.Url + "  ")
                }
                f.WriteString("

")

                // Now save the chapter's paragraphs
                for _, p := range chapter.Paragraphs {
                    f.WriteString(string(p) + "

")
                }
            }
        }

        // Now let's try to convert the markdown file into an ebook format (epub, pdf)
        fmt.Print("Attempting to convert Markdown file... ")
        cmdText := []string{"-S", "Worm.md", "--epub-chapter-level", "2", "-o", "Worm.epub"}
        if context.Bool("pdf") {
            cmdText = []string{"Worm.md", "-o", "Worm.pdf"}
            PageBreak = `<div style="page-break-after: always;"></div>`
        }
        cmd := exec.Command("pandoc", cmdText...)
        err = cmd.Run()
        if err != nil {
            fmt.Println("Conversion failed! Make sure you've installed Pandoc (http://johnmacfarlane.net/pandoc/installing.html) if you want to convert the generated Markdown file to an ebook compatible format. In the meantime, we've left you the Markdown file.")
        } else {
            _ = os.Remove("Worm.md")
            fmt.Println("Completed!")
        }
    }

    // Run the application
    app.Run(os.Args)
}

oh also would it be possible to modify it to output as .txt or .mobi? if not I'll just convert using Calibre. Thanks in advance. Oh if it matters I'm using windows 7 64-bit

  • 写回答

1条回答 默认 最新

  • doujingya1166 2014-06-27 17:09
    关注

    The go compiler doesn't import the libraries directly from the internet but it does know how to fetch them for you. When you import something like github.com/codegangsta/cli it doesn't look for it on that URL but instead it looks for it on your GOPATH/src folder.

    The go get command can fetch the library for you in it's URL and download it to your GOPATH.

    If you have already setup your GOPATH (if not, read How to Write Go Code) then before running your code run the command go get library for the go tool to download it for you. In your example you should run the following commands:

    go get github.com/codegangsta/cli
    go get github.com/puerkitobio/goquery
    

    That would download the libraries to GOPATH/src/github.com/codegangsta/cli and GOPATH/src/github.com/puerkitobio/goquery respectively.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大