使用Go解析html中的列表项

使用Go解析html中的列表项,go,Go,我想用Go提取所有列表项(每个)的内容。我应该使用regexp来获取项,还是有其他库用于此目的 我的意图是在Go中获取一个列表或数组,其中包含来自特定html网页的所有列表项。我应该怎么做?您可能想使用。 它不在Go标准包中,而是在。(子存储库是Go项目的一部分,但在主Go树之外。它们是在比Go核心更宽松的兼容性要求下开发的。) 该文档中的内容可能与您想要的内容类似 如果出于某种原因您需要坚持使用Go标准包,那么 对于“典型HTML”,您可以使用 两个软件包都倾向于使用io.Reader进行输入

我想用Go提取所有列表项(每个
  • )的内容。我应该使用regexp来获取
  • 项,还是有其他库用于此目的


    我的意图是在Go中获取一个列表或数组,其中包含来自特定html网页的所有列表项。我应该怎么做?

    您可能想使用。 它不在Go标准包中,而是在。(子存储库是Go项目的一部分,但在主Go树之外。它们是在比Go核心更宽松的兼容性要求下开发的。)

    该文档中的内容可能与您想要的内容类似

    如果出于某种原因您需要坚持使用Go标准包,那么 对于“典型HTML”,您可以使用

    两个软件包都倾向于使用
    io.Reader
    进行输入。如果您有
    字符串
    []字节
    变量,则可以使用
    字符串.NewReader
    字节.Buffer
    将它们包装起来,以获得
    io.Reader

    对于HTML,您更可能来自
    http.Response
    body (确保完成后将其关闭)。 也许是这样的:

        resp, err := http.Get(someURL)
        if err != nil {
            return err
        }
        defer resp.Body.Close()
    
        doc, err := html.parse(resp.Body)
        if err != nil {
            return err
        }
        // Recursively visit nodes in the parse tree
        var f func(*html.Node)
        f = func(n *html.Node) {
            if n.Type == html.ElementNode && n.Data == "a" {
                for _, a := range n.Attr {
                    if a.Key == "href" {
                        fmt.Println(a.Val)
                        break
                    }
                }
            }
            for c := n.FirstChild; c != nil; c = c.NextSibling {
                f(c)
            }
        }
        f(doc)
    }
    

    当然,对于在客户端使用JavaScript修改自己内容的页面,解析获取的网页是不起作用的。

    我找到了一种解决方法

    如果您试图提取
    li
    元素后的文本,您首先找到
    li
    元素,然后将标记器移动到下一个元素,该元素将是文本(希望如此)。如果下一个元素是锚点、跨度等,则可能需要使用一些逻辑

    resp, err := http.Get(url)
    if err!=nil{
        log.Fatal(err)
    }
    defer resp.Body.Close()
    
    z := html.NewTokenizer(bufio.NewReader(resp.Body))
    for {
        tt := z.Next()
        switch tt {
        case html.ErrorToken:
            return
        case html.StartTagToken:
            t := z.Token()
            swith t.Data {
            case "li":
                z.Next()
                t = z.Token()
                fmt.Println(t.Data)
            }
        }
    }
    

    但实际上,你应该只使用github.com/purkitobio/goquery

    也许这个功能很有用?你想浏览整个网站吗?不要尝试。一般来说,在使用regexp处理任何事情之前,都要三思而后行,它有它的位置,但是太多的人在他们做的每一件事上都会使用它。@DaveC这正是我开始这个问题的原因,以找出是否还有其他更合适的方法。我不理解所有的反对票……注意,我没有把
    golang.org/x/net/html
    包作为Go项目html解析器,所以这个答案的前一个版本只提到了Go标准
    encoding/xml
    包(在过去,当我想要/需要坚持使用标准包时,我会使用它进行简单的HTML解码)。