Не получаю значение с страницы. Парсинг

WebClient client = new WebClient();
client.Encoding = System.Text.Encoding.UTF8;
string ss;
using (Stream stream = client.OpenRead("https://vk.com/video-200689163_456239062/"))
{
    using (StreamReader sr = new StreamReader(stream))
        ss = sr.ReadToEnd();
}
String rate = Regex.Match(ss, @"<span class=""video_item_views"">(\d+\d+)<span class=""num_delim""> </span>").Groups[1].Value;//в notepad++ работает
Console.WriteLine(rate);

В notepad++ через регуляр.выражения находит:

<span class="video_item_views">(\d+\d+)<span class="num_delim"> </span>

Сам же шарп выдаёт пустую переменную Хотелось бы сделать без либ, если же без сильно, приведите примеры с либ


Ответы (1 шт):

Автор решения: aepot

Окей, допустим я поправлю регулярку и перепишу код так, что страница будет получаться правильно.

static readonly HttpClient client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.All })
{
    DefaultRequestVersion = HttpVersion.Version20
};

static async Task Main(string[] args)
{
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // потому что VK отвечает в кодировке Windows-1251
    client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0");
    string html = await client.GetStringAsync("https://vk.com/video638046557_456239079/");
    //Console.WriteLine(html);
    string rate = Regex.Match(html, @"<span class=""video_item_views"">(\d+)<span class=""num_delim""> <\/span>").Groups[1].Value;
    Console.WriteLine(rate);
    Console.ReadKey();
}

Вывод в консоль

1

И это работает как и должно, потому что в ответе от сервера есть только такой кусок

<span class="video_item_views">1<span class="num_delim"> </span>

А все почему? А потому, что то что вы ищете, отсутствует в ответе от сервера на текущий GET запрос, о чем вам яростно и пишут в комментариях выше. Выведите в консоль html и поищите глазами, где же на самом деле нужный фрагмент. Его там нет. Если уж дальше копать, то он есть в другом POST запросе к серверу al_video.php, который формируется яваскриптом. К сожалению, у меня нет возможности засесть и расковырять эту логику. Главное - я подсказал, куда копать. К тому же, я даже не знаю, какую задачу вы решаете.

Кстати, если уж парсить, то можно так, например с помощью HtmlAgilityPack.

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
var nodes = doc.DocumentNode.SelectNodes("//span[contains(@class, 'video_item_views')]");
foreach (var node in nodes)
{
    Console.WriteLine(node.InnerText);
}

Вывод в консоль

1 090 166 просмотров
1 090 166 просмотров

К сожалению, это все что есть в данном HTML документе, больше ничего нет.

Работать надо с тем, что отвечает сервер, а не с тем что формирует JavaScript. И вообще у VK есть толковое API, нет никакой причины парсить его вот таким вот образом. К тому же HTML регулярками обычно не парсят.

→ Ссылка