2011-09-22 18 views
6

का उपयोग कर स्ट्रिंग में वेबसाइट डाउनलोड करना मैं वेबसाइट की सामग्री डाउनलोड करने का प्रयास कर रहा हूं। हालांकि एक निश्चित वेबपृष्ठ के लिए वापस स्ट्रिंग में जंबल डेटा होता है, जिसमें कई वर्ण होते हैं।सी # सी # वेब क्लाइंट या HttpWebRequest

यहां वह कोड है जिसका मैं मूल रूप से उपयोग कर रहा था।

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

खोज मुझे लगता है कि इस एन्कोडिंग के साथ कोई समस्या हो सकती से, तो मैं करने की कोशिश की दोनों समाधान नीचे किंतु पोस्ट:

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); 

मैं भी वैकल्पिक कार्यान्वयन WebClient साथ एक ही परिणाम की कोशिश की, लेकिन अभी भी काम करने के लिए यह नहीं मिल सकता है।

हमलावर साइट है कि मैं डाउनलोड करने के लिए विकिपीडिया का अंग्रेज़ी संस्करण पर United_States लेख है नहीं कर पा रहे (एन। विकिपीडिया। Org/wiki/United_States)। हालांकि मैंने कई अन्य विकिपीडिया लेखों की कोशिश की है और इस मुद्दे को नहीं देखा है।

उत्तर

2

प्रतिक्रिया gzip एन्कोडेड है।

अद्यतन

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

@ ब्रोकनग्लस संकेत के लिए धन्यवाद। मुझे पहले ही आश्चर्य हुआ कि मुझे पहले कभी 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); 
} 

इसके अलावा इस अतः धागा देखें: WebClient forbids opening wikipedia page?

+0

मैंने पहली मुलाकात की आपने सुझाव दिया है और निम्न त्रुटि मिली है: 'gzip' समर्थित एन्कोडिंग नाम नहीं है। पैरामीटर नाम: System.Globalization.EncodingTable.internalGetCodePageFromName (स्ट्रिंग नाम) सिस्टम पर .globalization.EncodingTable पर नाम।GetCodePageFromName (स्ट्रिंग नाम) – EnISeeK

+0

@ निक: मेरे लिए ठीक काम किया - सुनिश्चित करें कि आपके पास HtmlAgilityPack का नवीनतम संस्करण है - मुझे NuGet – BrokenGlass

+0

से मेरा मिल गया है यह अभी भी NuGet से HtmlAgilityPack प्राप्त करने के बाद एक ही त्रुटि के साथ विफल रहा है। NuGet द्वारा स्थापित संस्करण 1.4.0.0 है। – EnISeeK

1

इस तरह मैं आमतौर पर एक स्ट्रिंग में एक पेज हड़पने (अपने वीबी, लेकिन आसानी से अनुवाद कर देना चाहिए) है:

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 

और समस्याओं आप कर रहे हैं नहीं किया है।

संबंधित मुद्दे