2019年9月10日火曜日

開発環境

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

コード

package main

import (
 "bufio"
 "fmt"
 "log"
 "net/http"
 "os"
 "strings"

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

func main() {
 url := os.Args[1]
 words, images, err := CountWordsAndImages(url)
 if err != nil {
  log.Fatal(err)
 }
 fmt.Printf("words: %v, images: %v\n", words, images)
}

func CountWordsAndImages(url string) (words, images int, err error) {
 resp, err := http.Get(url)
 if err != nil {
  return 0, 0, err
 }
 doc, err := html.Parse(resp.Body)
 resp.Body.Close()
 if err != nil {
  err = fmt.Errorf("parseing HTML: %s", err)
  return 0, 0, err
 }
 words, images = countWordsAndImages(doc)
 return words, images, nil
}

func countWordsAndImages(n *html.Node) (words, images int) {
 if n.Type == html.TextNode {
  reader := strings.NewReader(n.Data)
  input := bufio.NewScanner(reader)
  input.Split(bufio.ScanWords)
  for input.Scan() {
   words += 1
  }
 } else if n.Type == html.ElementNode && n.Data == "img" {
  images++
 }
 for c := n.FirstChild; c != nil; c = c.NextSibling {
  w, i := countWordsAndImages(c)
  words += w
  images += i
 }
 return words, images
}

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

$ go run sample5.go https://www.example.com
words: 93, images: 0
$ go run sample5.go https://www.mkamimura.com
words: 3950, images: 66
$ 

0 コメント:

コメントを投稿