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
)
@ 选择器让我感到困惑,这适合这种情况吗?
换句话说:
- 是否有合适的 HTML 示例可用?
- 是否有 ID、标签等的正确选择器列表?
- 是否可以通过名称找到标签,并从其内部内容标签中提取内容?
非常感谢!
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))
}
我正在查看文档示例 here,但它纯粹是在 XML 树上迭代,而不是 HTML。所以,我还是有点迷糊。
例如,如果我想通过名称在 head 标签中找到特定的 meta 标签,似乎我不能?相反,我需要按照它在 head 标签中的顺序找到它。在这种情况下,我想要第 8 个元标记,我假设它是:
headTag, err := getByID(xmlroot, "/head/meta[8]/")
当然,这是对标签名称使用 getByID 函数 - 我认为这不会起作用。 "getBy..." 命令的完整列表是什么?
那么,问题来了,如何访问meta标签的内容呢?该文档仅提供内部标记节点内容的示例。但是,这个例子行得通吗?:
resp.Query = extractValue(headTag,
@content
)
@ 选择器让我感到困惑,这适合这种情况吗?
换句话说:
- 是否有合适的 HTML 示例可用?
- 是否有 ID、标签等的正确选择器列表?
- 是否可以通过名称找到标签,并从其内部内容标签中提取内容?
非常感谢!
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))
}