首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Html解析器忽略img标记(Golang)

Html解析器忽略img标记(Golang)
EN

Stack Overflow用户
提问于 2016-07-10 15:47:28
回答 1查看 2.4K关注 0票数 3

我的任务是在html中查找图像urls。

问题

Html解析器golang.org/x/net/html以及github.com/PuerkitoBio/goquery igonores -页面http://www.ozon.ru/context/detail/id/34498204/上最大的图像

问题

  • 我的代码有什么问题?
  • 为什么需要使用img标记的src=""会被忽略?
  • 有办法用go从html中获取所有图像吗?

备注:

  • 当我使用用Swift编写的解析器时,这个图像已经在//static2.ozone.ru/multimedia/spare_covers/1013531536.jpg页面上找到了
  • 当我使用regex搜索时,已经找到了这个图像标记。
  • 当我使用第三方服务saveallimages.com时,已找到此图像标记。
  • 我试着使用gokogiri,但没有成功地在我的mac上编译它。Go get是成功的,但Go build永远坚持。

解析的html页面源

这是htmlresp, _ := http.Get(url)的结果

代码:

代码语言:javascript
复制
package main

import (
  "golang.org/x/net/html"
  "log"
  "net/http"
)


func main() {

  url := "http://www.ozon.ru/context/detail/id/34498204/"

  if resp, err := http.Get(url); err == nil {
    defer resp.Body.Close()

    log.Println("Load page complete")

    if resp != nil {
      log.Println("Page response is NOT nil")

      if document, err := html.Parse(resp.Body); err == nil {

        var parser func(*html.Node)
        parser = func(n *html.Node) {
          if n.Type == html.ElementNode && n.Data == "img" {

            var imgSrcUrl, imgDataOriginal string

            for _, element := range n.Attr {
              if element.Key == "src" {
                imgSrcUrl = element.Val
              }
              if element.Key == "data-original" {
                imgDataOriginal = element.Val
              }
            }

            log.Println(imgSrcUrl, imgDataOriginal)
          }

          for c := n.FirstChild; c != nil; c = c.NextSibling {
            parser(c)
          }

        }
        parser(document)
      } else {
        log.Panicln("Parse html error", err)
      }

    } else {
      log.Println("Page response IS nil")
    }
  }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-11 19:10:23

这不是一个bug,而是x/net/html的预期行为,它影响到所有基于x/net/html的解析器。

有四种可能的解决办法:

  1. 删除HTML中的<noscript></noscript>,这样x/net/html就可以像预期的那样解析其内容。类似于: 包主导入( "golang.org/x/net/html“"log”"net/http“"io/ioutil”“字符串”) func main() { url := "http://www.ozon.ru/context/detail/id/34498204/“(如果是resp,err := http.Get(Url));如果resp != nil {“页面响应不是零”//- := ioutil.ReadAll(resp.Body) resp.Body.Close() hdata := strings.Replace(string(data)、"“、"”、-1) hdata = strings.Replace(hdata、"“、-1) /--/err == nil { var解析器( *html.Node)解析器= func(n *html.Node){ if n.Type == html.ElementNode & n.Data == "img“{ var imgSrcUrl,imgDataOriginal string for _,元素:= range n.Attr { if element.Key == "src“{ imgSrcUrl = element.Val } if element.Key ==”data-原始“{ imgDataOriginal = element.Val} log.Println(imgSrcUrl,imgDataOriginal) }c := n.FirstChild;C !=零;C= c.NextSibling {解析器(C)}解析器(文档){log.Panicln(“parser错误”,err) }{log.Println(“页面响应为零”)}
  2. x/net/htmlhttps://github.com/bearburger/net/commit/42ac75393ced8c48137b574278522df1f3fa2cec补丁
  3. 在go 1.4中使用gokogiri (我很确定这是支持的最后一个版本)
  4. 等待对https://github.com/golang/go/issues/16318的决定,如果这是真正的错误,我会发出拉请求。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38293657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档