0
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>

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

aepot
  • 49,560
  • Вы уверены, что строка ss содержит то, что вы ищете регуляркой? Как проверили? – aepot Oct 24 '21 at 01:57
  • <\/span> слеш надо экрарировать, откройте regex101.com, потестируйте там. А вообще задача 3 строками кода решается без регулярок. Подсказка – aepot Oct 24 '21 at 02:07
  • Не понимаю как сделал решение в 3 строки, не могли бы написать?Не понимаю как пользоваться данным сайтом – Andrey Laki Oct 24 '21 at 03:06
  • Для начала разберитесь с моим первым комментарием. – aepot Oct 24 '21 at 07:10
  • 1
    Забудьте про браузер во время написания кода, он вам выдает то, что вы видите, а не то, что есть на самом деле! Получите программно HTML код страницы, скопируйте его в блокнот или еще куда, ну и уже по нему ориентируйтесь. Помните, многие сайты дают вам лишь заготовку, без данных, эта страница содержит лишь базовый HTML, скрипты JS и стили CSS, а уже после того, как вы ее получили, запускаются скрипты JS, которые подгружают сам контент. Браузер выдает вам HTML после всех скриптов, а программа ДО. И да, WebClient устарел в языке C#; ну и да, у ВК есть API, стоит использовать его! – EvgeniyZ Oct 24 '21 at 09:40
  • Удалось понять, в чем проблема? Если да, вы можете принять ответ, поставив зеленую галочку слева от него. – aepot Oct 25 '21 at 09:08

1 Answers1

0

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

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 регулярками обычно не парсят.

aepot
  • 49,560