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

2 Answers
Ну если у вас есть 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
-
У тебя в пределах 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;
}
}
}
- 41
String.IndexOf? А так тот же Html Agility Pack – Иван Aug 03 '18 at 22:36