Нужна помощь в парсинге массива
Всем привет!
Мне необходимо спарсить цены за определенное количество дней данного предмета - https://steamcommunity.com/market/listings/730/Snakebite%20Case (снизу график, о нём идет речь). Открыв код страницы, внизу я нашел длинный массив var line1, который как раз содержит в себе нужную мне информацию.
Для парсинга использую C# и Selenium, но, как правильно составить запрос для поиска данного var line1 - не представляю, т.к. здесь нет ни имени класса, ни тега, ни селектора и т.д.
Подскажите, как можно его спарсить ? Или, есть более простое решение моей задачи, может я чего-то проглядел ?
Ответы (1 шт):
Парсить это селениумом это как из гранатомета по воробьям. Есть способ проще. Решаю прямо в лоб не вникая в детали, вы просили способ выдрать данные из HTML - выдираю данные.
Так как нужная вам строка находится внутри яваскрипта, то HTML апрсер не поможет ее достать. Все что может здесь HTML парсер - это выдернуть <script> ноду и дать вам ее содержимое. Но ноду все равно придется разбирать как строку. Поэтому я сразу решил обработать весь HTML как строку.
Создаем контейнер для данных
class DataItem
{
public DateTime Date { get; set; }
public double Value { get; set; }
public string Id { get; set; }
public override string ToString()
{
return $"{Date} {Value} {Id}";
}
}
И пишем вот такой простой код
class Program
{
private static readonly HttpClient client = new HttpClient();
static async Task Main(string[] args)
{
string url = "https://steamcommunity.com/market/listings/730/Snakebite%20Case";
string html = await client.GetStringAsync(url);
string tmp = html.Substring(html.IndexOf("var line1=") + 10); // отпиливаем голову
string json = tmp.Remove(tmp.IndexOf(";\r\n")); // отпиливаем хвост
DataItem[] items = JsonSerializer.Deserialize<JsonElement[][]>(json) // парсим этот кривой json
.Select(o => new DataItem { Date = DateTime.Parse(o[0].GetString().Replace(":", ":00")), Value = o[1].GetDouble(), Id = o[2].GetString() }).ToArray();
foreach (DataItem item in items) // выводим данные
Console.WriteLine(item);
Console.ReadKey();
}
}
Вывод в консоль
04.05.2021 2:00:00 19,998 722
04.05.2021 3:00:00 15,107 2621
04.05.2021 4:00:00 14,391 2952
04.05.2021 5:00:00 13,61 2532
04.05.2021 6:00:00 12,19 2493
04.05.2021 7:00:00 13,43 2243
04.05.2021 8:00:00 13,438 1853
04.05.2021 9:00:00 13,799 1873
04.05.2021 10:00:00 13,08 2136
04.05.2021 11:00:00 10,758 2987
04.05.2021 12:00:00 10,611 3656
04.05.2021 13:00:00 9,282 3883
04.05.2021 14:00:00 9,156 4003
04.05.2021 15:00:00 8,576 4240
...