2016-01-21 80 views
1

我學習去,我有下面的代碼工作正常:我會複製resp.Body嗎?

resp, err := http.Get(url) // get the html 
    ... 
doc, err := html.Parse(resp.Body) // parse the html page 

現在我想打印出來的HTML第一,然後做解析:

resp, err := http.Get(url) 
    ... 
b, err := ioutil.ReadAll(resp.Body) // this line is added, not working now... 
doc, err := html.Parse(resp.Body) 

我想原因是RESP 。Body是一個讀者,我不能稱之爲讀兩次?任何想法如何正確地做到這一點?複製resp.Body?

回答

5

因爲客戶端從網絡傳輸響應正文,所以無法兩次讀取正文。

閱讀對[]byte的回覆,因爲您已經在這樣做。使用bytes.NewReader在HTML解析器的字節上創建io.Reader

resp, err := http.Get(url) 
... 
b, err := ioutil.ReadAll(resp.Body) 
doc, err := html.Parse(bytes.NewReader(b)) 
+0

謝謝!爲什麼原來的那個不工作?我猜是因爲我讀了兩次?你能否詳細解釋一下? – WhatABeautifulWorld

+0

@WhatABeautifulWorld查看更新後的答案。 –

+0

@WhatABeautifulWorld您通常無法讀取兩次流。這在大多數語言中都是如此。根據實現情況的不同,數據流可能不會保留所有緩存在內存中的數據,而是會在客戶端使用它們時傳輸一小部分數據,一旦數據被客戶端讀取,它們甚至可能會從內存中丟棄數據(因此無法讀兩遍。) –

相關問題