2019年4月30日火曜日

開発環境

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES) (Alan A.A. Donovan(著)、Brian W. Kernighan(著)、柴田 芳樹(翻訳)、丸善出版)の第5章(関数)、5.2(再帰)、練習問題5.4の解答を求めてみる。

コード

package main

import (
 "fmt"
 "os"

 "golang.org/x/net/html"
)

func main() {
 doc, err := html.Parse(os.Stdin)
 if err != nil {
  fmt.Fprintf(os.Stderr, "findlinks: %v\n", err)
  os.Exit(1)
 }

 links := make(map[string][]string)
 for k, ls := range visit(links, doc) {
  fmt.Println(k)
  for _, l := range ls {
   fmt.Println(l)
  }
 }
}

func visit(links map[string][]string, n *html.Node) map[string][]string {
 if n == nil {
  return links
 }
 if n.Type == html.ElementNode {
  if n.Data == "img" {
   for _, a := range n.Attr {
    if a.Key == "src" {
     links["img"] = append(links["imag"], a.Val)
    }
   }
  } else if n.Data == "script" {
   for _, a := range n.Attr {
    if a.Key == "src" {
     links["script"] = append(links["script"], a.Val)
    }
   }
  } else if n.Data == "link" {
   for _, a := range n.Attr {
    if a.Key == "href" {
     links["link"] = append(links["link"], a.Val)
    }
   }
  }

 }
 links = visit(links, n.FirstChild)
 links = visit(links, n.NextSibling)
 return links
}

入出力結果(cmd(コマンドプロンプト)、Terminal)

$ ./fetch https://golang.org | go run sample4.go
script
/lib/godoc/jquery.js
/lib/godoc/playground.js
/lib/godoc/godocs.js
link
/lib/godoc/style.css
/opensearch.xml
$ ./fetch https://example.com | go run sample4.go
$ ./fetch https://www.iana.org/domains/reserved | go run sample4.go
link
/_css/2015.1/screen.css
/_css/2015.1/print.css
/_img/bookmark_icon.ico
script
/_js/2013.1/jquery.js
/_js/2013.1/iana.js
img
/_img/2013.1/iana-logo-header.svg
$ 

0 コメント:

コメントを投稿