Не получаю значение с страницы. Парсинг
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 шт):
Окей, допустим я поправлю регулярку и перепишу код так, что страница будет получаться правильно.
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 регулярками обычно не парсят.