2016-07-10 2 views
2

Meine Aufgabe ist es, Bilder URLs innerhalb einer HTML-HTML-Parser ignoriert img-Tag (Golang)

Das Problem

HTML-Parser golang.org/x/net/html sowie zu finden als github.com/PuerkitoBio/goquery das größte Bild auf der Seite igonores http://www.ozon.ru/context/detail/id/34498204/

Die Frage

  • Was ist falsch in meinem Code
  • Warum erforderlich img Tag mit src="" wird ignoriert?
  • Gibt es Möglichkeiten, alle Bilder aus HTML mit zu bekommen?

Hinweise:

  • Wenn ich verwendet parser written in Swift dieses Bild auf der Seite wurde gefunden //static2.ozone.ru/multimedia/spare_covers/1013531536.jpg

  • Dieses Bild-Tag gefunden wurde, wenn i regex Suche verwenden.

  • Dieses Bild-Tag gefunden wurde, wenn i Drittdienst verwenden saveallimages.com

  • Ich habe versucht, verwenden gokogiri hat aber keinen Erfolg es auf meinem Mac zu kompilieren. Go get ist erfolgreich, aber Go build für immer fest.

Parsed HTML-Seite Quelle

This is the html die resp, _ := http.Get(url) Ergebnis ist

Code:

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

} 
+1

Ich bin nicht 100%, aber ich glaube, Sie reichte auch das Problem auf [https://github.com/golang/go/issues/16318](https://github.com/golang/ go/issues/16318) vor ein paar Minuten. Ich denke, das hängt damit zusammen, da das Bild in einem "noscript" -Tag steht. –

+0

@DonovanSolms danke. Ich verlinkte diesen Beitrag in dem von Ihnen verlinkten Thread. – George

+1

@DonovanSolms Ich habe das Problem eingereicht. Und ja, es ist verwandt :-) –

Antwort

2

Dies ist kein Bug, sondern erwartete Verhalten von x/net/html, die wirkt alle gleich basierend auf x/net/html.

Es gibt vier mögliche Lösungen:

  1. entfernen <noscript> und </noscript> in HTML so x/net/html würde ihren Inhalt analysieren, wie erwartet. Etwas wie:

    package main 
    
    import (
        "golang.org/x/net/html" 
        "log" 
        "net/http" 
        "io/ioutil" 
        "strings" 
    ) 
    
    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") 
          // -------------- 
          data, _ := ioutil.ReadAll(resp.Body) 
          resp.Body.Close() 
    
          hdata := strings.Replace(string(data), "<noscript>", "", -1) 
          hdata = strings.Replace(hdata, "</noscript>", "", -1) 
          // -------------- 
    
          if document, err := html.Parse(strings.NewReader(hdata)); 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") 
         } 
        } 
    
    } 
    
  2. Patch-x/net/html mit https://github.com/bearburger/net/commit/42ac75393ced8c48137b574278522df1f3fa2cec

  3. Verwenden gokogiri mit 1 gehen.4 (Ich bin mir ziemlich sicher, dass dies die letzte Version ist)

  4. Warte auf Entscheidung auf https://github.com/golang/go/issues/16318 Wenn das ein echter Bug ist, werde ich die Pull-Anfrage machen.