Если совсем кратко то алгоритм должен быть примерно такой:
1. Ищем нужную табличку.
2. Мы знаем, что количество столбцов там одинаковое, в первом столбце всегда язык, в первой строке заголовка нет тега td.
3. Удаляем мусор банальными заменами - этого достаточно должно быть, чтобы не мешало перед глазами (в дальнейшем в рабочей версии это можно убрать)
4. На сколько я понял брать нужно только русский-английский - определим допустим, что английский = 1, русский = 0
5. Получаем все теги TR нашей таблички в какой-то массив
6. В найденном массиве ищем массив тегов TD.
7. Первой ячейке присваиваем язык (по жесткому условию, содержится ли в переменной имя языка)
8. Во всех ячейках проверяем наличие галочки - галочка есть - 1, галочки нет 0, не нужную ячейку просто не принимаем во внимание
9. Добавляем найденные значения в какой-то временный список
10. Дальше соединим строчки списка - получится какая-то строка
11. Строкам с нужными для нас показателями присвоим какие-то значения через switch
12. Если ничего не найдено (из желанного нами - пустая строка).
Чисто на коленке думаю должен подойти этот код.
string url = @"https://store.steampowered.com/app/261550/Mount__Blade_II_Bannerlord/";
string get = ZennoPoster.HttpGet(url: url);
string table = Regex.Match(get, @"<table[\w\W]*?</table>").Value;
table = Regex.Replace(table, @"(?<=<table)[\w\W]*?(?=>)", string.Empty, RegexOptions.IgnoreCase);
table = Regex.Replace(table, @"(?<=<tr)[\w\W]*?(?=>)", string.Empty, RegexOptions.IgnoreCase);
table = Regex.Replace(table, @"(?<=<td)[\w\W]*?(?=>)", string.Empty, RegexOptions.IgnoreCase);
table = Regex.Replace(table, @"(?<=<th)[\w\W]*?(?=>)", string.Empty, RegexOptions.IgnoreCase);
table = Regex.Replace(table, @"\s+", " ", RegexOptions.IgnoreCase);
table = Regex.Replace(table, @"> <", ">\r\n<", RegexOptions.IgnoreCase);
string[] trs = Regex.Matches(table, @"(?<=<tr>)[\w\W]*?(?=</tr>)").Cast<Match>().Select(s => s.Value).ToArray();
List<string> list = new List<string>();
foreach(string tr in trs) {
string[] tds = Regex.Matches(tr, @"(?<=<td>)[\w\W]*?(?=</td>)").Cast<Match>().Select(s => s.Value).ToArray();
if(tds.Length < 1) {
project.SendInfoToLog("Вероятнее всего - шапка", true);
continue;
}
else {
string lang = tds[0].Trim();
if(lang == "English" || lang == "Английский") lang = "1"; // en
if(lang == "Русский") lang = "0"; // ru
if(lang == "0" || lang == "1") {
project.SendInfoToLog(lang);
int I = tds[1].Contains("10004") ? 1 : 0;
project.SendInfoToLog(I.ToString());
int O = tds[2].Contains("10004")? 1 : 0;
project.SendInfoToLog(O.ToString());
int S = tds[3].Contains("10004") ? 1 : 0;
project.SendInfoToLog(S.ToString());
list.Add(string.Format(@"{0}{1}{2}",lang,I,O)); // S пропускаем...
}
else {
project.SendInfoToLog("Язык не нужен - пропускаем");
continue;
}
}
}
project.SendInfoToLog(list.Count.ToString());
string line = string.Join("", list);
string out_line = string.Empty;
project.SendInfoToLog(line.Length.ToString());
if(line.Length == 3){
// найден один язык либо русский либо английский
switch(line){
case "111":out_line = "en";
break;
case "011": out_line = "ru";
break;
case "010": out_line = "runo";
break;
case "110": out_line = "enno";
break;
default:out_line = string.Empty;
break;
}
}
else if(line.Length == 6){
// Найдено два языка русский и английский
switch(line){
case "010101": out_line = "ruen";
break;
case "101010": out_line = "ruen";
break;
default:out_line = string.Empty;
break;
}
}
else return out_line;
return out_line;