public static string GetBetweenTagData(string tag, string line) {
string Result = "";
string pattern = string.Format(@"\<{0}.*?\>(?<tagData>.+?)\<\/{0}\>", tag.Trim());
// \<{0}.*?\> - открывающий тег
// \<\/{0}\> - закрывающий тег
// (?<tegData>.+?) - содержимое тега, записываем в группу tegData
Regex regex = new Regex(pattern, RegexOptions.ExplicitCapture);
MatchCollection matches = regex.Matches(line);
if (matches.Count > 0)
Result = (matches[0].Groups["tagData"].Value);
return Result;
}
public static string GetTagValue(string param_name, string line) {
string Result = "";
//string pattern = string.Format(@".*?{0}=(?<paramData>.+?) ", param_name.Trim());
string pattern = string.Format(@".*?{0}=[\',\''](?<paramData>.+?)('>|'\s)", param_name.Trim());
// \<{0}.*?\> - открывающий тег
// \<\/{0}\> - закрывающий тег
// (?<tegData>.+?) - содержимое тега, записываем в группу tegData
Regex regex = new Regex(pattern, RegexOptions.ExplicitCapture);
MatchCollection matches = regex.Matches(line);
if (matches.Count > 0)
Result = matches[0].Groups["paramData"].Value;
return Result;
}
С чем столкнулся. Столкнулся либо с пока еще нереализованными возможностями самого .Net Framework'а и кое что пришлось переписывать, так же обратил внимание, что много методов в .Net Core 1.0 реализовано для асинхронного запуска. Что тоже пришлось переделывать под Task, async, await.
static async Task<string> DownloadPageAsync() {
using (HttpClient httpClient = new HttpClient())
using (HttpResponseMessage httpResponse = await httpClient.GetAsync("http://www.dohod.ru/ik/analytics/dividend"))
using (HttpContent content = httpResponse.Content) {
string result = await content.ReadAsStringAsync();
return result;
}
}
Кому интересен так же main, привожу. Кстати код парсит заглавную страницу с дивидендными бумагами для дальнейшего анализа и обработки.
public static void Main(string[] args)
{
string htmlCode = DownloadPageAsync().Result; //Загрузка страницы N компании
string htmlTableData = htmlCode.Substring(htmlCode.IndexOf("<tbody>") + 7,
htmlCode.IndexOf("</tbody>") - htmlCode.IndexOf("<tbody>") - 7)
.Trim()
.Replace((char)10, ' ')
.Replace('\"', '\''); //Получение таблицы в html
string tableRow = "";
string result = "";
int nColumn = 0;
while ((tableRow = GetBetweenTagData("tr", htmlTableData).Trim()) != "" ) { //Проход всех строк таблицы
string tableCol = "";
result = "";
nColumn = 0;
while (tableRow.IndexOf("td") > 0) { //Проход столбцов строки
nColumn++;
tableCol = GetBetweenTagData("td", tableRow).Trim();
switch (nColumn) {
case 1: {
if (tableCol.Contains("href"))
tableCol = GetTagValue("href", tableCol) + "\t" + GetBetweenTagData("a", tableCol);
else
tableCol = "\t" + tableCol;
} break;
case 5: {
tableCol = GetTagValue("title", tableCol);
} break;
case 10: {
tableCol = GetTagValue("title", tableCol);
} break;
}
tableRow = tableRow.Remove(0, tableRow.IndexOf("</td>") + 5);
result = result + "\t" + tableCol;
}
if (result.Length > 0)
Console.WriteLine(result);
htmlTableData = htmlTableData.Remove(0, htmlTableData.IndexOf("</tr>") + 5);
}
}
}
Вообщем пока можно сказать, что пришли одни вкусняшки, по мере усложнения задач, будем посмотреть, как оно пойдет. За код сильно не критикуйте. Не кодил c# около 4-5 месяцев. С с++ сразу не перейти на все плюшки.
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
github.com/dotnet/core/blob/master/roadmap.md
blogs.msdn.microsoft.com/dotnet/2016/06/27/announcing-net-core-1-0/
Показывали даже что-то скомпиленное под Распберри Пи.
А сколько у тебя прибыль при этом?
Всё равно в чем: в енотах североамериканских, в процентах, в деревяшках...?