HTML C# | Parser [закрыт]

203
14 октября 2018, 07:30

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

Answer 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" (Без кавычек)

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

Answer 2

У тебя в пределах 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;
        }
    }
}
READ ALSO
Как выполнить валидацию по клику MVVM

Как выполнить валидацию по клику MVVM

Первоначально при запуске TextBox пустой, если я начинаю в нем что то печатать, а потом удаляю все, чтобы он был пустой, то появляется ошибка валидацииНо...

218
Отправка AJAX формы .Net MVC

Отправка AJAX формы .Net MVC

Всем добрый деньПытаюсь отправить AJAX форму на сервер, но метод контроллера, которым должна обрабатываться форма, не вызывается

209