我正在查看记录的示例here,但它纯粹是在XML树上进行迭代,而不是HTML。因此,我仍然感到困惑。
例如,如果我想在名称中的 head 标记内找到特定的 meta 标记,那么我似乎不能?相反,我需要按照 head 标记中的顺序找到它。在这种情况下,我想要第8个元标记,我假设是:
headTag,错误:= getByID(xmlroot," / head / meta [8] /")
但是,当然,这是使用标签名称的getByID函数 - 我不相信它会起作用。 " getBy ..."的完整列表是什么?命令吗
然后,问题是,如何访问元标记的内容?该文档仅提供内部标记节点内容的示例。但是,这个例子会起作用吗?:
resp.Query = extractValue(headTag,
@content
)
@选择器让我困惑,这适合这种情况吗?
换句话说:
非常感谢!
答案 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))
}