Parse broken HTML with golang

huangapple go评论91阅读模式
英文:

Parse broken HTML with golang

问题

我需要在一个 HTML 字符串中找到元素。不幸的是,这个 HTML 几乎是损坏的(例如,没有开放标签的闭合标签)。

我尝试使用 launchpad.net/xmlpath 的 XPath,但它无法解析 HTML 文件,非常有 bug。

如何在 Golang 中查找损坏的 HTML 中的元素?如果可以使用 XPath 来查找具有特定 id 或 class 的标签,我更倾向于使用 XPath,但我也可以接受其他解决方案。

英文:

I need to find elements in an HTML string. Unfortunately the HTML is pretty much broken (e.g. closing tags without an opening pair).

I tried to use XPath with launchpad.net/xmlpath but it can't parse an HTML file so damn buggy.

How can I find elements in a broken HTML with golang? I would prefer using XPath, but I am open for other solutions too if I can use it to look for tags with a specific id or class.

答案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)
	}
}

net/html似乎可以完成这个任务。

所以这就是我现在正在做的事情。

英文:

It seems net/html does the job.

So that's what I am doing now:

package main

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

func main() {
	brokenHtml := `&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;body&gt;&lt;h1 id=&quot;someid&quot;&gt;My First Heading&lt;/h1&gt;&lt;p&gt;paragraph&lt;/body&gt;&lt;/html&gt;`

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

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

	var b bytes.Buffer
	html.Render(&amp;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=&#39;someid&#39;]`
	path := xmlpath.MustCompile(xpath)
	if value, ok := path.String(xmlroot); ok {
		log.Println(&quot;Found:&quot;, value)
	}
}

huangapple
  • 本文由 发表于 2014年6月8日 07:54:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/24101721.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定