Як я можу отримати вміст веб-сторінки та зберегти його у змінну рядка


75

Як я можу отримати вміст веб-сторінки за допомогою ASP.NET? Мені потрібно написати програму, щоб отримати HTML веб-сторінки та зберегти її у рядкову змінну.

Відповіді:


116

Ви можете використовувати WebClient

Using System.Net;
    
WebClient client = new WebClient();
string downloadString = client.DownloadString("http://www.gooogle.com");

На жаль, DownloadString (станом на .NET 3.5) недостатньо розумний для роботи зі специфікаціями. У свою відповідь я включив альтернативу.
user2246674

13
Ні голосу проти, тому що не використовується (клієнт WebClient = новий WebClient ()) {} :)
Девід Карлаш

3
Це еквівалентно відповіді Стівена Спілберга, опублікованій за 3 хвилини до цього, тож жодного +1.
BalinKingOfMoria відновлює СМ

72

Я раніше стикався з проблемами з Webclient.Downloadstring. Якщо ви це зробите, ви можете спробувати це:

WebRequest request = WebRequest.Create("http://www.google.com");
WebResponse response = request.GetResponse();
Stream data = response.GetResponseStream();
string html = String.Empty;
using (StreamReader sr = new StreamReader(data))
{
    html = sr.ReadToEnd();
}

6
Чи можете ви детальніше розповісти про проблему, яку мали?
Грег

17
@Greg, це була проблема, пов’язана з продуктивністю. Я ніколи насправді не вирішував цього, але WebClient.DownloadString забирав 5-10 секунд, щоб витягнути HTML, де як WebRequest / WebResponse було майже негайно. Просто хотів запропонувати ще одне альтернативне рішення на випадок, якщо у ОП виникнуть подібні проблеми або потрібен трохи більше контролю над запитом / відповіддю.
Скотт

7
@Scott - +1 для пошуку цього. Просто проведіть кілька тестів. DownloadString зайняв набагато більше часу під час першого використання (5299msringstringring vs 200ms WebRequest). Перевірено в циклі понад 50 x BBC, 50 x CNN і 50 x Інші URL-адреси RSS-каналу, використовуючи різні URL-адреси, щоб уникнути кешування. Після початкового завантаження DownloadString вийшов на 20 мс швидше для BBC, на 300 мс швидше на CNN. Для іншого каналу RSS WebRequest був швидшим на 3 мс. Як правило, я думаю, що я буду використовувати WebRequest для синглів та DownloadString для перегляду URL-адрес.
HockeyJ

4
Це мені вдалось чудово, дякую! Просто, щоб, можливо, заощадити іншим трохи пошуку, WebRequest знаходиться в System.Net, а Stream - у System.Io
Ерік Барр,

1
Скотт, @HockeyJ - Я не знаю, що змінилося з тих пір, як ти використовував WebClient, але коли я тестував його (за допомогою .NET 4.5.2), це було досить швидко - 950 мс (все ще трохи повільніше, ніж один веб-запит, який зайняв 450 мс, але не 5-10 секунд точно).
BornToCode

27

Я рекомендую не використовувати WebClient.DownloadString. Це пов’язано з тим, що (принаймні в .NET 3.5) DownloadString недостатньо розумний, щоб використовувати / видалити специфікацію, якщо вона має бути. Це може призвести до того, що специфікація ( ) неправильно відображається як частина рядка, коли повертаються дані UTF-8 (принаймні без набору символів) - ick!

Натомість цей незначний варіант буде коректно працювати зі специфікаціями:

string ReadTextFromUrl(string url) {
    // WebClient is still convenient
    // Assume UTF8, but detect BOM - could also honor response charset I suppose
    using (var client = new WebClient())
    using (var stream = client.OpenRead(url))
    using (var textReader = new StreamReader(stream, Encoding.UTF8, true)) {
        return textReader.ReadToEnd();
    }
}

подати повідомлення про помилку
JoelFan

12
Webclient client = new Webclient();
string content = client.DownloadString(url);

Передайте URL-адресу сторінки, яку ви хочете отримати. Ви можете проаналізувати результат за допомогою htmlagilitypack.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.