2011-09-22 35 views
6

我試圖下載網站的內容。但是,對於某個網頁,返回的字符串包含混亂的數據,其中包含許多 字符。C#使用C#WebClient或HttpWebRequest將網站下載到字符串中

這是我最初使用的代碼。

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); 
req.Method = "GET"; 
req.UserAgent = "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))"; 
string source; 
using (StreamReader reader = new StreamReader(req.GetResponse().GetResponseStream())) 
{ 
    source = reader.ReadToEnd(); 
} 
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(source); 

我也試過可選的實施方式與Web客戶端,但還是同樣的結果:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
using (WebClient client = new WebClient()) 
using (var read = client.OpenRead(url)) 
{ 
    doc.Load(read, true); 
} 

從搜索我想這可能是與編碼的問題,所以我想這兩個解決方案,但仍保持貼無法讓這個工作。

違規的網站,我似乎無法下載是維基百科的英文版本的美國的文章(恩。維基百科。組織/維基/美國)。 雖然我已經嘗試了一些其他wikipedia文章,並沒有看到這個問題。

回答

2

響應是gzip編碼的。 請嘗試以下方法解碼流:

UPDATE

基於由BrokenGlass設置以下屬性應該能解決你的問題的意見(工作對我來說):

req.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate"; 
req.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; 

舊/手動解決方案:

string source; 
var response = req.GetResponse(); 

var stream = response.GetResponseStream(); 
try 
{ 
    if (response.Headers.AllKeys.Contains("Content-Encoding") 
     && response.Headers["Content-Encoding"].Contains("gzip")) 
    { 
     stream = new System.IO.Compression.GZipStream(stream, System.IO.Compression.CompressionMode.Decompress); 
    } 

    using (StreamReader reader = new StreamReader(stream)) 
    { 
     source = reader.ReadToEnd(); 
    } 
} 
finally 
{ 
    if (stream != null) 
     stream.Dispose(); 
} 
+1

你不應該手動做這個,這是建立在已經,即看到這個答案:http://stackoverflow.com/questions/2973208/automatically-decompress-gzip-response-via-webclient-downloaddata – BrokenGlass

+0

@BrokenGlass感謝您的提示。我已經想知道爲什麼我以前從未遇到過使用gzip編碼的問題。 – Peter

+0

謝謝,這對我有用! – EnISeeK

3

使用內置在HtmlAgilityPack裝載機工作對我來說:

HtmlWeb web = new HtmlWeb(); 
HtmlDocument doc = web.Load("http://en.wikipedia.org/wiki/United_States"); 
string html = doc.DocumentNode.OuterHtml; // I don't see no jumbled data here 

編輯:

使用標準WebClient與您的用戶代理將導致HTTP 403 - 禁止 - 使用這不是爲我工作:

using (WebClient wc = new WebClient()) 
{ 
    wc.Headers.Add("user-agent", "Mozilla/5.0 (Windows; Windows NT 5.1; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4"); 
    string html = wc.DownloadString("http://en.wikipedia.org/wiki/United_States"); 
    HtmlDocument doc = new HtmlDocument(); 
    doc.LoadHtml(html); 
} 

另請參閱該SO主題:WebClient forbids opening wikipedia page?

+0

我試了第一次見面你建議並得到以下錯誤: 「gzip」不是支持的編碼名稱。 參數名稱:名稱 位於System.Globalization.EncodingTable.internalGetCodePageFromName(字符串名稱) 位於System.Globalization.EncodingTable。GetCodePageFromName(String name) – EnISeeK

+0

@Nick:對我來說工作很好 - 確保你有最新版本的HtmlAgilityPack - 我從NuGet獲得我的 – BrokenGlass

+0

從NuGet獲得HtmlAgilityPack後,仍然出現相同的錯誤。 NuGet安裝的版本是1.4.0.0。 – EnISeeK

1

這是怎麼了,我通常抓住一個頁面爲一個字符串(其VB,但應該很容易翻譯):

req = Net.WebRequest.Create("http://www.cnn.com") 
Dim resp As Net.HttpWebResponse = req.GetResponse() 
sr = New IO.StreamReader(resp.GetResponseStream()) 
lcResults = sr.ReadToEnd.ToString 

,並沒有你的問題。