Goを使用してWebスクレイパーを作成しようとしています。私はその言語をかなり使い慣れていますし、htmlパーサーを使用している間に何が間違っているのか分かりません。私はアンカータグを見つけるためにhtmlを解析しようとしていますが、html.TokenTypeEndを代わりに取得しています。Goを使ってHTMLを解析する
package main
import (
"fmt"
"golang.org/x/net/html"
"io/ioutil"
"net/http"
)
func GetHtml(url string) (text string, resp *http.Response, err error) {
var bytes []byte
if url == "https://www.coastal.edu/scs/employee" {
resp, err = http.Get(url)
if err != nil {
fmt.Println("There seems to ben an error with the Employee Console.")
}
bytes, err = ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Cannot read byte response from Employee Console.")
}
text = string(bytes)
} else {
fmt.Println("Issue with finding URL. Looking for: " + url)
}
return text, resp, err
}
func main() {
htmlSrc, response, err := GetHtml("https://www.coastal.edu/scs/employee")
if err != nil {
fmt.Println("Cannot read HTML source code.")
}
_ = htmlSrc
htmlTokens := html.NewTokenizer(response.Body)
i := 0
for i < 1 {
tt := htmlTokens.Next()
fmt.Printf("%T", tt)
switch tt {
case html.ErrorToken:
fmt.Println("End")
i++
case html.TextToken:
fmt.Println(tt)
case html.StartTagToken:
t := htmlTokens.Token()
isAnchor := t.Data == "a"
if isAnchor {
fmt.Println("We found an anchor!")
}
}
}
私は、アプリケーションがGetHtml
で、本体の最後まで読み fmt.Printf("%T", tt)
:
コードがに簡素化することができます。これは既に 'GetHtml'関数で使われています。どうしてあなたはHTML文字列全体を読んでいるのですが、とにかくそれを投げるのですか? – RayfenWindspear
私はPythonに慣れているので、私はhtmlを読んで文字列として返す必要があると思っていました。これは私が書いた初めてのGoプログラムであり、私はそれを理解しようとしているので、その言語にはとても新しいです。 – King
'io.Reader'や' io.ReadCloser'sに出くわしたときは、できればそれを変数に読み込まないようにしたいと思っています。これらのタイプの最適化によって、正しく使用すると効率が向上します。このため、最初にhtml.NewTokenizerが1つ必要です。ちょうどいくつかのアドバイス。応答が巨大ではないことが確かな場合は、 'ioutil.ReadAll'を使うのが大丈夫です。 – RayfenWindspear