【问题标题】:Getting blank return when using GoQuery to get video src使用GoQuery获取视频src时返回空白
【发布时间】:2014-08-27 02:09:32
【问题描述】:

我正在尝试使用 GoQuery 获取藤蔓的 .mp4 视频源。但是,当我运行它时,我什么也没有得到,没有错误,或者返回。只是一个空行。

package main

import (
  "fmt"
  "log"

  "github.com/PuerkitoBio/goquery"
)

func getMP4URL() {
  doc, err := goquery.NewDocument("https://vine.co/v/MlWtKgwh7WY")
  if err != nil {
    log.Fatal(err)
  }

  doc.Find(".vine-video-container").Each(func(i int, s *goquery.Selection) {
    mp4, _ := s.Find("video").Attr("src")
    fmt.Printf("MP4: %s", mp4)
  })
}

func main() {
  getMP4URL()
}

这是我的代码的问题,还是 vine 本身的问题?

【问题讨论】:

  • 使用浏览器检查工具将 DOM 状态与原始 HTML 源进行比较。您可能会看到视频容器存在于 DOM 中,但不存在于 HTML 源代码中。可能是由于浏览器检测代码或类似的原因。

标签: go goquery


【解决方案1】:

似乎 vine 用 javascript 添加了该 ID

如果我添加

html, err := doc.Html()
if err != nil {
    log.Fatal(err)
}

log.Println(html)

doc.Find 之前,html 输出中没有.vine-video-container

【讨论】:

    【解决方案2】:

    试试这个代码:)

    package main
    
    import (
        "fmt"
        "log"
    
        "github.com/PuerkitoBio/goquery"
    )
    
    func getMP4URL() {
        doc, err := goquery.NewDocument("https://vine.co/v/MlWtKgwh7WY")
        if err != nil {
            log.Fatal(err)
        }
    
        doc.Find("meta").Each(func(i int, s *goquery.Selection) {
            op, _ := s.Attr("itemprop")
            if op == "contentURL" {
                fmt.Println(s.Attr("content"))
            }
        })
    }
    
    func main() {
        getMP4URL()
    }
    

    【讨论】:

    • 导致“meta”标签中定义的 mp4 url​​ 不是“vine-video-container”
    【解决方案3】:

    Vine 在<script type="application/ld+json"> 中以 JSON 格式嵌入视频的元数据。所以需要从标签中提取JSON blob,对JSON进行解码,得到视频的src。

    以下是获取Vine视频src URL的完整工作代码:

    package main
    
    import (
        "encoding/json"
        "github.com/PuerkitoBio/goquery"
    )
    
    type SharedContent struct {
        ContentUrl string `json:"contentUrl"`
    }
    
    type VineVideoMetadata struct {
        SC SharedContent `json:"sharedContent"`
    }
    
    func DecodeVineJsonBlob(blob string) VineVideoMetadata {
        meta := VineVideoMetadata{}
        err := json.Unmarshal([]byte(blob), &meta)
        if err != nil {
            panic(err)
        }
        return meta
    }
    
    func GetVineVideoJsonBlob(url string) string {
        doc, err := goquery.NewDocument(url)
        if err != nil {
            panic(err)
        }
    
        return doc.Find("script[type=\"application/ld+json\"]").Text()
    }
    
    func GetVineVideoSrc(url string) string {
        jsonBlob := GetVineVideoJsonBlob(url)
        meta := DecodeVineJsonBlob(jsonBlob)
        return meta.SC.ContentUrl
    }
    
    func main() {
        println(GetVineVideoSrc("https://vine.co/v/MlWtKgwh7WY"))
    }
    

    输出:

    https://mtc.cdn.vine.co/r/videos/67FAC9DFA21115619347885645824_22a564aec15.5.0.17428816123715427422.mp4?versionId=4zcm5ySoFhqUQBXU7Ehm3YOuOSjFbkg3
    

    【讨论】:

      猜你喜欢
      • 2017-08-21
      • 2019-08-05
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多