0

Требуется спарсить данное значение из g_steamID средствами C# введите сюда описание изображения

Zabeg
  • 59
  • 2
    Если это всё, что вам нужно, то почему бы просто поиском подстроки не сделать String.IndexOf? А так тот же Html Agility Pack – Иван Aug 03 '18 at 22:36
  • Дело в том, что я вообще не понимаю как парсить даже тэги, а отдельные строки тем более) Мне надо спарсить эти циферки из g_steamID – Zabeg Aug 03 '18 at 22:37
  • Вам ссылку дали, будьте добры, зайдите по ней. Или документация не для вас? – Vitaliy Stop_RU_war_in_UA Aug 03 '18 at 22:48
  • Связанный: https://ru.stackoverflow.com/questions/420354/Как-распарсить-html-в-net – MSDN.WhiteKnight Aug 04 '18 at 17:14

2 Answers2

1

Ну если у вас есть html от которого нужен только steamID, то:

string html = "<script>    g_steamID = \"7786578\" ddd"; // Для примера
int startIndex = html.IndexOf("steamID");
startIndex = html.IndexOf('\"', startIndex);

string steamID = "";
while (startIndex < html.Length && html[startIndex + 1] != '\"')
    steamID += html[++startIndex];
// steamID = "7786578" (Без кавычек)

Код написан втупую, но основной посыл должен быть понятен. Можно и через регулярку, но думать сейчас уже не в состоянии.

Иван
  • 1,109
  • Мне надо скачать html код по ссылке https://steamcommunity.com/id/blyagdeya И спарсить значение – Zabeg Aug 03 '18 at 22:56
  • 3
    @Zabeg о-о-о, а это уже беда. Там и false может быть, и в другом месте и виде этот steamID. Тут уже основательно прорабатывать нужно. Сходу такое уже не сделать. Учите язык. Работу со строками и т.д. Попробуйте сами что-то и если уже вопросы сюда приходите. За вас решать такого рода задачи вряд ли будут. – Иван Aug 03 '18 at 23:01
  • https://steamcommunity.com/id/blyagdeya?xml=1 А если такого рода? Стим айди на 2 строке всегда – Zabeg Aug 03 '18 at 23:16
  • @Zabeg спарсить XML гораздо проще, задайте это отдельным вопросом. – tym32167 Aug 04 '18 at 10:46
0

У тебя в пределах html старницы профиля есть ещё один script-текст, который вроде бы всегда содержит SteamId. Парси тогда из него, раз в первом скрипте может быть false вместо целевого значения. Во втором скрипте он всегда инициализирован реальным значением. Забирай хоть регуляркой, хоть String.Split, чем душе угодно.

Если дело не обходится одним только SteamId, то гораздо удобнее сразу юзать какую-нибудь либу. Вон вверху советовали HtmlAgilityPack. Я предпочитаю для таких вещей AngleSharp. Пример дал ниже. Но для парсинга единственного значения это конечно как из пушки по воробьям.

using AngleSharp.Dom.Html;
using AngleSharp.Parser.Html;
using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace StackOverflowQuestion
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private async void ButtonParse_Click(object sender, EventArgs e)
        {
            string steamId = await ParseSteamId();
        }

        private async Task<string> ParseSteamId()
        {
            // Грузим нужную нам страницу
            string url = "https://steamcommunity.com/id/blyagdeya";
            string html = await LoadHtml(url);

            // Создаём экземпляр парсера из AngleSharp
            HtmlParser parser = new HtmlParser();
            IHtmlDocument document = parser.Parse(html);

            // Парсим нужный нам элемент html страницы. Div класса 'responsive_page_template_content' является уникальным в пределах всей страницы
            // и включает в себя целевой скрипт, текст которого уже всегда(*) включает SteamId.
            // *Я просмотрел 10 случайных профилей, для всех случаев SteamId был инициализирован реальным значением, никаких 'false'.

            var targetScriptWithSteamId = document.QuerySelector(".responsive_page_template_content > script"); // Селекторы тут https://www.w3.org/TR/selectors/
            string scriptText = targetScriptWithSteamId?.TextContent;
            string id = scriptText.Split(new string[] { "steamid\":\"", "\",\"" }, 3, StringSplitOptions.RemoveEmptyEntries)[1];

            return id;
        }

        private async Task<string> LoadHtml(string url)
        {
            HttpClient client = new HttpClient();
            HttpResponseMessage response = await client.GetAsync(url);
            string source = null;

            if (response != null && response.StatusCode == HttpStatusCode.OK)
            {
                source = await response.Content.ReadAsStringAsync();
            }

            return source;
        }
    }
}
aleko
  • 41