GoLang - XmlPath 选择器 HTML

GoLang - XmlPath Selectors with HTML

我正在查看文档示例 here,但它纯粹是在 XML 树上迭代,而不是 HTML。所以,我还是有点迷糊。

例如,如果我想通过名称在 head 标签中找到特定的 meta 标签,似乎我不能?相反,我需要按照它在 head 标签中的顺序找到它。在这种情况下,我想要第 8 个元标记,我假设它是:

headTag, err := getByID(xmlroot, "/head/meta[8]/")

当然,这是对标签名称使用 getByID 函数 - 我认为这不会起作用。 "getBy..." 命令的完整列表是什么?

那么,问题来了,如何访问meta标签的内容呢?该文档仅提供内部标记节点内容的示例。但是,这个例子行得通吗?:

resp.Query = extractValue(headTag, @content)

@ 选择器让我感到困惑,这适合这种情况吗?

换句话说:

  1. 是否有合适的 HTML 示例可用?
  2. 是否有 ID、标签等的正确选择器列表?
  3. 是否可以通过名称找到标签,并从其内部内容标签中提取内容?

非常感谢!

XPath 似乎不适合这里;您应该使用专为 HTML.

而设计的 goquery

这是一个例子:

package main

import (
    "fmt"

    "github.com/PuerkitoBio/goquery"
)

func main() {
    doc, err := goquery.NewDocument("https://example.com")
    if err != nil {
        panic(err)
    }
    s := doc.Find(`html > head > meta[name="viewport"]`)
    if s.Length() == 0 {
        fmt.Println("could not find viewpoint")
        return
    }
    fmt.Println(s.Eq(0).AttrOr("content", ""))
}

我知道这个回答晚了,但我还是想推荐一个htmlquery基于XPath表达式的简单而强大的包*。

以下代码基于@Time-Cooper 示例。

package main

import (
    "fmt"

    "github.com/antchfx/htmlquery"
)

func main() {
    doc, err := htmlquery.LoadURL("https://example.com")
    if err != nil {
        panic(err)
    }
    s := htmlquery.Find(doc, "//meta[@name='viewport']")
    if len(s) == 0 {
        fmt.Println("could not find viewpoint")
        return
    }
    fmt.Println(htmlquery.SelectAttr(s[0], "content"))

    // alternative method,but simple more.
    s2 := htmlquery.FindOne(doc, "//meta[@name='viewport']/@content")
    fmt.Println(htmlquery.InnerText(s2))
}