C # Загрузка веб-сайта в строку с использованием C # WebClient или HttpWebRequest - PullRequest
6 голосов
/ 22 сентября 2011

Я пытаюсь загрузить содержимое веб-сайта. Однако для определенной веб-страницы возвращаемая строка содержит перемешанные данные, содержащие много символов..

Вот код, который я изначально использовал.

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, но результат все тот же:

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

По результатам поиска я думаю, что это может быть проблема с кодировкой, поэтому я попробовал оба решения, опубликованные ниже, но все еще не могу заставить это работать.

Сайт-нарушитель, который я не могу загрузить, - это статья United_States о английской версии WikiPedia (en. Wikipedia. Org / wiki / United_States) Хотя я пробовал ряд других статей в Википедии и не видел этой проблемы.

Ответы [ 3 ]

3 голосов
/ 22 сентября 2011

Использование встроенного загрузчика в 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 запрещает открывать страницу википедии?

2 голосов
/ 22 сентября 2011

Ответ кодируется в формате 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 голос
/ 22 сентября 2011

Вот как я обычно перетаскиваю страницу в строку (это 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

и у меня не было проблем, которые у вас есть.

...