【问题标题】:GoLang - XmlPath Selectors with HTMLGoLang - 带有 HTML 的 XmlPath 选择器
【发布时间】:2017-06-26 08:53:17
【问题描述】:

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

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

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

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

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

resp.Query = extractValue(headTag, @content)

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

换句话说:

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

非常感谢!

【问题讨论】:

    标签: html xpath go xml-parsing selector


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我知道这个答案来晚了,但我仍然想推荐一个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))
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-13
        • 1970-01-01
        • 2016-04-25
        • 2017-01-17
        • 1970-01-01
        • 2021-03-31
        • 1970-01-01
        • 2020-07-30
        相关资源
        最近更新 更多