2016-10-09 5 views
1

現在、htmlトークナイザhttps://godoc.org/golang.org/x/net/htmlを使用しています。「無限ループ」により到達不能なコードが発生する

私がしたいことは、次の通りです。urlからすべてのリンクを取得し、urlに特定の文字列が含まれている場合 - > url-listに追加します。

"fmt.Println(urls)"に到達できないため、これは機能しません。ループのofcはある時点で終了しますが、これはコンパイルされません。ループの後に到達可能なコードを取得するにはどうすればよいですか?

よろしく

答えて

1

ループにbreakはありません。終了する唯一の方法はreturnで、この機能から制御を送信します。つまり、fmt.Println(urls)に到達できません。

はこれを試してみてください:

L: 
for { 
    tt := z.Next() 

    switch { 
    case tt == html.ErrorToken: 
     break L 
    case tt == html.StartTagToken: 
     t := z.Token() 

     isAnchor := t.Data == "a" 
     if !isAnchor { 
      continue 
     } 

     ok, url := getHref(t) 
     if !ok { 
      continue 
     } 
     if strings.Contains(url, "somestring") { 
      urls = append(urls, url) 
     } 

    } 
} 
+0

これは魔法のように動作します!ありがとうございました。 –

1

使用例は、彼らがここで提供:https://godoc.org/golang.org/x/net/html#example-Parse

がこれをフィットするようにコードを変更:

resp, err = client.Get("someurl") 
var urls []string 

if err != nil { 
    log.Fatal(err) 
} 

doc, err := html.Parse(strings.NewReader(resp.Body)) 
if err != nil { 
    log.Fatal(err) 
} 

var f func(*html.Node) 
f = func(n *html.Node) { 
    if n.Type == html.ElementNode && n.Data == "a" { 
     for _, a := range n.Attr { 
      if a.Key == "href" { 
       fmt.Println(a.Val) 

       if strings.Contains(a.Val, "somestring") { 
        urls = append(urls, a.Val) 
       } 

       break 
      } 
     } 
    } 
    for c := n.FirstChild; c != nil; c = c.NextSibling { 
     f(c) 
    } 
} 
f(doc) 
関連する問題