使用golang解析损坏的HTML

9

我需要在HTML字符串中查找元素。不幸的是,HTML几乎是残缺不全的(例如没有开放标签就有闭合标签)。

我试图使用 launchpad.net/xmlpath 的XPath,但它无法解析HTML文件,所以非常不稳定。

如何在golang中查找破损的HTML元素?我倾向于使用XPath,但如果我可以用它来查找具有特定id或类的标记,我也可以考虑其他解决方案。


对于那些现在遇到这个问题的人,请注意xmlpath项目已经迁移到(并得到改进)https://gopkg.in/xmlpath.v1。 - ChrisR
1个回答

21

看起来 net/html 可以胜任此任务。

那么现在我正在进行的就是:

package main

import (
    "strings"
    "golang.org/x/net/html"
    "log"
    "bytes"
    "gopkg.in/xmlpath.v2"
)

func main() {
    brokenHtml := `<!DOCTYPE html><html><body><h1 id="someid">My First Heading</h1><p>paragraph</body></html>`

    reader := strings.NewReader(brokenHtml)
    root, err := html.Parse(reader)

    if err != nil {
        log.Fatal(err)
    }

    var b bytes.Buffer
    html.Render(&b, root)
    fixedHtml := b.String()

    reader = strings.NewReader(fixedHtml)
    xmlroot, xmlerr := xmlpath.ParseHTML(reader)

    if xmlerr != nil {
        log.Fatal(xmlerr)
    }

    var xpath string
    xpath = `//h1[@id='someid']`
    path := xmlpath.MustCompile(xpath)
    if value, ok := path.String(xmlroot); ok {
        log.Println("Found:", value)
    }
}

你知道如何迭代所有与给定XPath匹配的“Node”吗?谢谢。 - ChrisR
iter := path.Iter(xmlroot) for iter.Next() { log.Println(iter.Node().String()) }迭代器 := path.Iter(xmlroot) 对于 迭代器.Next() { 日志.打印(迭代器.Node().String()) } - Kreisquadratur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接