golang无法写入文本文件:句柄无效

时间:2015-06-02 09:32:10

标签: go

大家好,

我为很快就提出另一个问题而道歉,但最近Go似乎是一件又一件事。

我有一个有效的网页抓取工具(感谢所有人的帮助),可以从这个维基页面抓取我想要的所有信息:http://monsterhunter.wikia.com/wiki/MH4U:_Item_List

然后显示我想要的一切,没有打嗝。但是,当我写入.txt文件时,我得到一个错误说明:" 0写mh4u.txt:句柄无效"

以下是我目前的参考代码:

package main

import (
    "fmt"
    "log"

    "github.com/PuerkitoBio/goquery"
    "os"
    "io"
)

func main() {

    filename := "mh4u.txt"
    file, err := os.Create(filename)

    if err!= nil {
        fmt.Println(err)
    }
    doc, err := goquery.NewDocument("http://www.ign.com/wikis/monster-hunter-4/Items")
    if err != nil {
        log.Fatal(err)
    }

    doc.Find("tbody").Each(func(i int, s *goquery.Selection) {

        s.Find("td").Each(func(j int, s2 *goquery.Selection) {

            if s3 := s2.Find("img"); s3 != nil && s3.Length() > 0 {
                return
            }

            fmt.Printf(s2.Text())
            n, err := io.WriteString(file, s2.Text())

            if err != nil {
                fmt.Println(n, err) 
            }
        })

        file.Close()
    })
}

使用其他网站测试此代码会让我相信可能有一些隐藏的角色会给作者带来一些问题,但这是我唯一可以猜到的。

非常感谢您提供的任何建议/提示/解决方案!

1 个答案:

答案 0 :(得分:5)

您在关闭内部调用file.Close()。如果多次调用doc.Find("tbody").Each,您最终会尝试写入已关闭的文件。您应该在创建文件后立即关闭文件:

file, err := os.Create(filename)
if err != nil {
    log.Fatal(err)
}
defer file.Close()