GoLang - 带有HTML的XmlPath选择器

时间:2017-02-08 16:13:25

标签: html xpath go xml-parsing selector

我正在查看记录的示例here,但它纯粹是在XML树上进行迭代,而不是HTML。因此,我仍然感到困惑。

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

  

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

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

然后,问题是,如何访问元标记的内容?该文档仅提供内部标记节点内容的示例。但是,这个例子会起作用吗?:

  

resp.Query = extractValue(headTag,@content

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

换句话说:

  1. 是否有适当的HTML示例?
  2. 是否有正确的ID,标签等选择器列表?
  3. 可以通过名称找到标签,还可以从内部内容标签中找到内容?
  4. 非常感谢!

2 个答案:

答案 0 :(得分:4)

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", ""))
}

答案 1 :(得分:0)

我知道这个答案来晚了,但是我仍然想推荐一个基于XPath表达式*的简单且功能强大的 htmlquery 包。

以下基于@ 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))
}