PDA

Просмотр полной версии : [Руководство] Парсинг запросов


Hermein
28.04.2011, 18:14
Каждый день задается очень много вопросов по поводу того, как например достать число убийств боссов, количество папирос и тому подобное, так вот все очень просто Пишем процедуру я назвал ее parse:
string res;
private string parse(string text, string ind1, string ind2)
{
res = "";//зануляем
string[] stringSeparators = new string[] { "\n" };
string[] result = text.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);
foreach (string stroka in result)
{if (stroka.IndexOf(ind1) != -1)
{string[] Moneyy = stroka.ToString().Split((Convert.ToChar(">")));
res = Moneyy[1].Replace(ind2, "");
}
}
return res;
}
где text - это текст который надо распарсить,ind1,ind2-место откуда начать/где закончить

далее отправляем запрос:
Счелкаем 2 раза по кнопке и вставляем туда код:
String s1 = "key=" + textBox2.Text + "&user=" + textBox1.Text + "&method=getInfo";
[Ссылки могут видеть только зарегистрированные и активированные пользователи] request = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])WebRequest.Create("[Ссылки могут видеть только зарегистрированные и активированные пользователи]");
request.UserAgent = "Opera/9.80";
request.Method = "POST";
request.ContentType = "application/x-[Ссылки могут видеть только зарегистрированные и активированные пользователи]";
byte[] EncodedPostParams = Encoding.ASCII.GetBytes(s1);
request.ContentLength = EncodedPostParams.Length;
request.GetRequestStream().Write(EncodedPostParams , 0, EncodedPostParams.Length);
request.GetRequestStream().Close();
// Получаем ответ
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
//Получаем html-код страницы
string html= new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
//После чего с помощью процедуры parse можем достать из запроса абсолютно любое значение:

label1.Text = "Энергия: " + parse(html, "<energy>", "</energy");
label2.Text = "Папиросы: " + parse(html, "<money>", "</money");
label3.Text = "Борода: " + parse(html, "<beard>", "</beard");

Сразу встает вопрос а как же вытащить боссов ведь там же одинаковые переменные??? Существует много способов, но я скажу о самом простом:
итак после того как вытащили все что нужно делаем следующее:

int k=html.IndexOf("<bossId>2</bossId>");
string boss1=html.Remove(0,k);
/*выше описанным методом пользуемся и достаем победы второго босса но используя text не html а boss1*/
label4.Text = "Сизый: " + parse(boss1, "<winCount>", "</winCount");

добавляем так же неймспейсы:

using System.IO;
using System.Net;

Вот в принципе и все!

StabiliZator
28.04.2011, 18:19
Можешь полностью код написать на одного босса что бы статистика высвечивалась

Hermein
28.04.2011, 19:07
Можешь полностью код написать на одного босса что бы статистика высвечивалась

Я же написал с самого начала выводишь - я пример привел в лэйблы до кирпича включительно потом все что до второго босса удаляешь
В примере я же написал-Сизый-а это уже второй босс

_MykytiuK_
28.04.2011, 19:16
Вот такая ошибка:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
что делать?

StabiliZator
28.04.2011, 19:41
выдели её, наведи на нее, появится иконка и там будет написано сделать заглушку

Hermein
28.04.2011, 19:51
Вы че какую заглушку с ума сошли что ли???

Добавлено через 2 минуты
Вот такая ошибка:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
что делать?

Пишет что parse не существует! А ты процедуру parse добавил???
Руководство внимательнее читаем!

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Hermein
28.04.2011, 20:06
выдели её, наведи на нее, появится иконка и там будет написано сделать заглушку

Откуда ты это придумал заглушку делать???
А процедура parse для чего дана???

Nickitee
28.04.2011, 20:23
private string parse(string ishodnik, string scan)
{
string[] stringSeparators = new string[] { "\n" };
string[] result = ishodnik.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);
foreach (string stroka in result)
{
if (stroka.IndexOf(scan) != -1)
{
string[] Massiv = stroka.ToString().Split((Convert.ToChar(">")));
string Finish = Massiv[0].ToString().Replace("<", "");
scan = Massiv[1].Replace(@"</" + Finish, "");
}
}
return scan;
}

Улучшенная версия "парсинга".
Теперь надо только указать что искать, очченььь просто.
Пример:

string htmlPage = "<bossId>2</bossId>";
MessageBox.Show(parse(htmlPage, "bossId"));


P.S. Адаптировано только для ВК-Тюряги.
Если внимательно изучить код, можно настроить и для своих нужд.

Hermein
29.04.2011, 12:35
private string parse(string ishodnik, string scan)
{
string[] stringSeparators = new string[] { "\n" };
string[] result = ishodnik.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);
foreach (string stroka in result)
{
if (stroka.IndexOf(scan) != -1)
{
string[] Massiv = stroka.ToString().Split((Convert.ToChar(">")));
string Finish = Massiv[0].ToString().Replace("<", "");
scan = Massiv[1].Replace(@"</" + Finish, "");
}
}
return scan;
}

Улучшенная версия "парсинга".
Теперь надо только указать что искать, очченььь просто.
Пример:

string htmlPage = "<bossId>2</bossId>";
MessageBox.Show(parse(htmlPage, "bossId"));


P.S. Адаптировано только для ВК-Тюряги.
Если внимательно изучить код, можно настроить и для своих нужд.

Это для тюряги хорошо, но если теги не равны то эта процедура не прокатит, она более сжатая, как например инфу о кореше узнать его победах над боссами можно используя только парс, что я дал выше, и вообще это просто пример небольшой

StabiliZator
29.04.2011, 13:45
можете полностью код написать что бы высвечивалась статистика боссов, а не по частям! а то вставляю а не чего не выходит!

Hermein
29.04.2011, 16:32
можете полностью код написать что бы высвечивалась статистика боссов, а не по частям! а то вставляю а не чего не выходит!

string res;
private string parse(string text, string ind1, string ind2)
{ res = "";
string[] stringSeparators = new string[] { "\n" };
string[] result = text.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);
foreach (string stroka in result)
{if (stroka.IndexOf(ind1) != -1)
{string[] Moneyy = stroka.ToString().Split((Convert.ToChar(">")));
res = Moneyy[1].Replace(ind2, "");
}
}
return res;
}
private void button3_Click(object sender, EventArgs e)
{String secondStepForm = "method=getFriendModels" + "&user=" + textBox1.Text + "&key=" + textBox2.Text + "&friend%5Fuid=" + textBox3.Text;
[Ссылки могут видеть только зарегистрированные и активированные пользователи] request = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])WebRequest.Create("[Ссылки могут видеть только зарегистрированные и активированные пользователи]");
request.UserAgent = "Opera/9.80";
request.Method = "POST";
request.ContentType = "application/x-[Ссылки могут видеть только зарегистрированные и активированные пользователи]";
byte[] EncodedPostParams = Encoding.ASCII.GetBytes(secondStepForm);
request.ContentLength = EncodedPostParams.Length;
request.GetRequestStream().Write(EncodedPostParams , 0, EncodedPostParams.Length);
request.GetRequestStream().Close();
// Получаем ответ
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
string html = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
string boss1 = parse(html, "<boss id=\"1\">", "</boss");
string boss2 = parse(html, "<boss id=\"2\">", "</boss");
string boss3 = parse(html, "<boss id=\"3\">", "</boss");
string boss4 = parse(html, "<boss id=\"4\">", "</boss");
string boss5 = parse(html, "<boss id=\"5\">", "</boss");
richTextBox1.Text += "Кирпич:" + boss1 + "\n" + "Сизый:" + boss2 + "\n" + "Махно:" + boss3 + "\n" + "Лютый:" + boss4 + "\n" + "Шайба:" + boss5 + "\n";
}

Процедура parse и вывод инфы о боссах в richTextbox1 по нажатию button3

StabiliZator
29.04.2011, 16:57
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
что делать
и для чего
textBox3.Text

Hermein
29.04.2011, 17:10
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
что делать
и для чего
textBox3.Text

Ты готовый код не можешь уже выделить! в самый верх смотри видешь объявлена стринг res???? а у тебя в коде я ее не заметил!
3 текстбокс-это у кого ты хочешь посмотреть, если у себя то в коде вместо 3 бокса напиши textBox1.Text

_MykytiuK_
01.05.2011, 11:22
hermein, спасибо очень-очень помог

Добавлено через 11 часов 23 минуты
С этим то понятно, а я столкунлся вот с чем, как рaспарсить данные такова типа:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Hermein
05.05.2011, 12:12
hermein, спасибо очень-очень помог

Добавлено через 11 часов 23 минуты
С этим то понятно, а я столкунлся вот с чем, как рaспарсить данные такова типа:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

IndexOf-ом ищешь нужное место и до него удаляешь либо сабстринг

bohdan09
07.05.2011, 12:23
hermein, самое главное забыл) - подключить using System.Net; и using System.IO; =)

Добавлено через 54 минуты
Hermein, у меня вылазит ошибка

Ошибка 1 Элемент "secondStepForm" не существует в текущем контексте. C:\Users\Администратор\Documents\Visual Studio 2010\Projects\WFParser\WFParser\Form1.cs 45 64 WFParser

request.Method = "POST";
request.ContentType = "application/x-[Ссылки могут видеть только зарегистрированные и активированные пользователи]";
byte[] EncodedPostParams = Encoding.ASCII.GetBytes(secondStepForm);
request.ContentLength = EncodedPostParams.Length;

И зачем здесь secondStepForm?

Проблема решена), вместо secondStepForm впишете переменную s1(от автора)

Добавлено через 2 часа 30 минут
Кому нужно полный листинг урока:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;

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

string res;
private string parse(string text, string ind1, string ind2)
{
res = "";//зануляем
string[] stringSeparators = new string[] { "\n" };
string[] result = text.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);
foreach (string stroka in result)
{
if (stroka.IndexOf(ind1) != -1)
{
string[] Moneyy = stroka.ToString().Split((Convert.ToChar(">")));
res = Moneyy[1].Replace(ind2, "");
}
}
return res;
}

private void button1_Click(object sender, EventArgs e)
{
String s1 = "key=" + textBox2.Text + "&user=" + textBox1.Text + "&method=getInfo";
[Ссылки могут видеть только зарегистрированные и активированные пользователи] request = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])WebRequest.Create("[Ссылки могут видеть только зарегистрированные и активированные пользователи]");
request.UserAgent = "Opera/9.80";
request.Method = "POST";
request.ContentType = "application/x-[Ссылки могут видеть только зарегистрированные и активированные пользователи]";
byte[] EncodedPostParams = Encoding.ASCII.GetBytes(s1);
request.ContentLength = EncodedPostParams.Length;
request.GetRequestStream().Write(EncodedPostParams , 0, EncodedPostParams.Length);
request.GetRequestStream().Close();
// Получаем ответ
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
//Получаем html-код страницы
string html = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
//После чего с помощью процедуры parse можем достать из запроса абсолютно любое значение:

label1.Text = "Энергия: " + parse(html, "<energy>", "</energy");
label2.Text = "Папиросы: " + parse(html, "<money>", "</money");
label3.Text = "Борода: " + parse(html, "<beard>", "</beard");

int k = html.IndexOf("<bossId>2</bossId>");
string boss1 = html.Remove(0, k);
/*выше описанным методом пользуемся и достаем победы второго босса но используя text не html а boss1*/
label4.Text = "Сизый: " + parse(boss1, "<winCount>", "</winCount");
}

}
}

XRASER
26.06.2011, 14:51
Разкидываю кол-во ключей на боссов по label'ам, столкнулся с одиннаковыми тегами, вытаскиывются постоянно только с кирпича, что делать?

String secondStepForm = "user=" + textBox1.Text +"&method=getBoss&sig=" + textBox3.Text + "&key=" + textBox2.Text;
[Ссылки могут видеть только зарегистрированные и активированные пользователи] request = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])WebRequest.Create("[Ссылки могут видеть только зарегистрированные и активированные пользователи]");
// Настраиваем параметры запроса
request.UserAgent = "Opera/9.80";
request.Method = "POST";
// Указываем тип отправляемых данных
request.ContentType = "application/x-[Ссылки могут видеть только зарегистрированные и активированные пользователи]";
// Преобразуем данные к соответствующую кодировку
byte[] EncodedPostParams = Encoding.ASCII.GetBytes(secondStepForm);
request.ContentLength = EncodedPostParams.Length;
// Записываем данные в поток
request.GetRequestStream().Write(EncodedPostParams , 0, EncodedPostParams.Length);
request.GetRequestStream().Close();
// Получаем ответ
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
//Получаем html-код страницы
string html = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
//После чего с помощью процедуры parse можем достать из запроса абсолютно любое значение:
label16.Text = parse(html, "<num>", "</num");
int k = html.IndexOf("<id>2</id");
string boss1 = html.Remove(0, k);
/*выше описанным методом пользуемся и достаем победы второго босса но используя text не html а boss1*/
label17.Text = parse(boss1, "<num>", "</num");

В чем ошибка?

Hermein
27.06.2011, 11:44
запихни в массив ответ и все потом по индексам от 0 расставь-либо для каждого удаляй до нужного места

XRASER
27.06.2011, 12:29
запихни в массив ответ и все потом по индексам от 0 расставь-либо для каждого удаляй до нужного места

Не обратил внимания, у меня высвечивается последнее число стоящее в тегах <num>*</num>, а это ключи для Махно, как сделать массив, что изменить в коде:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Что сделать чтобы можно было разкидать значения <num>*</num> по label'ам?
На что заменить html?
И как сделать чтобы высвечивалось первое найденное число, а не последнее?

Hermein
27.06.2011, 15:22
for (int i=0;i<mass.Length;i++)
{
MessageBox.Show(mass[i]);

}
с массивом в цикле работай и все

XRASER
27.06.2011, 16:48
// Получаем ответ
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
//Получаем html-код страницы
string html = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
//После чего с помощью процедуры parse можем достать из запроса абсолютно любое значение:
label16.Text = parse(html, "<num>", "</num");
int k = html.IndexOf("<id>2</id>");
string boss1 = html.Remove(0, k);
/*выше описанным методом пользуемся и достаем победы второго босса но используя text не html а boss1*/
label17.Text = parse(boss1, "<num>", "</num");
Regex rex = new Regex(@"[^0-9]{1,}");
string[] mass = rex.Split(html);
for (int i-0;i<mass.Length;i++)
{
MessageBox.Show(mass[i]);
}
Что не так, 10 ошибок выдает...

Добавлено через 53 минуты
Можно пример, начиная с получения ответа...

Hermein
27.06.2011, 19:42
Что не так, 10 ошибок выдает...

Добавлено через 53 минуты
Можно пример, начиная с получения ответа...

дам готовый код-только со всего овета он!-тоесть с html:

string[] pobed = html.Split('\n');
for (int i = 0; i < pobed.Length; i++)
{ if (pobed[i].IndexOf("<winCount>") != -1) { pobed[i] = Regex.Replace(pobed[i], @"\D", string.Empty); MessageBox.Show(pobed[i]);
}
}

XRASER
27.06.2011, 20:06
дам готовый код-только со всего овета он!-тоесть с html:

string[] pobed = html.Split('\n');
for (int i = 0; i < pobed.Length; i++)
{ if (pobed[i].IndexOf("<winCount>") != -1) { pobed[i] = Regex.Replace(pobed[i], @"\D", string.Empty); MessageBox.Show(pobed[i]);
}
}

Спс, все сработало, выдает на MessageBox.Show все значения по порядку, но что-то я не так делаю с label'ами...
string html = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
string[] key = html.Split('\n');
for (int i = 0; i < key.Length; i++)
{
if (key[i].IndexOf("<num>") != -1)
{
key[i] = Regex.Replace(key[i], @"\D", string.Empty); MessageBox.Show(key[i]);
label16.Text = key[0];
label17.Text = key[1];
label18.Text = key[2];
label19.Text = key[3];
label20.Text = key[4];
}
}

Hermein
27.06.2011, 20:15
Спс, все сработало, выдает на MessageBox.Show все значения по порядку, но что-то я не так делаю с label'ами...
string html = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
string[] key = html.Split('\n');
for (int i = 0; i < key.Length; i++)
{
if (key[i].IndexOf("<num>") != -1)
{
key[i] = Regex.Replace(key[i], @"\D", string.Empty); MessageBox.Show(key[i]);
label16.Text = key[0];
label17.Text = key[1];
label18.Text = key[2];
label19.Text = key[3];
label20.Text = key[4];
}
}

Кей вытащи из цикла и все типа:

for (int i = 0; i < key.Length; i++)
{
if (key[i].IndexOf("<num>") != -1)
{
key[i] = Regex.Replace(key[i], @"\D", string.Empty);
}
}
label16.Text = key[0];
label17.Text = key[1];
label18.Text = key[2];
label19.Text = key[3];
label20.Text = key[4];

XRASER
28.06.2011, 09:57
Кей вытащи из цикла и все типа:

for (int i = 0; i < key.Length; i++)
{
if (key[i].IndexOf("<num>") != -1)
{
key[i] = Regex.Replace(key[i], @"\D", string.Empty);
}
}
label16.Text = key[0];
label17.Text = key[1];
label18.Text = key[2];
label19.Text = key[3];
label20.Text = key[4];

Исправил код, но получается вот так:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Код:
// Получаем ответ
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
//Получаем html-код страницы
string html = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
string[] key = html.Split('\n');
for (int i = 0; i < key.Length; i++)
{
if (key[i].IndexOf("<num>") != -1)
{
key[i] = Regex.Replace(key[i], @"\D", string.Empty);
MessageBox.Show(key[i]);
}
}
label16.Text = key[0];
label17.Text = key[1];
label18.Text = key[2];
label19.Text = key[3];
label20.Text = key[4];
MessageBox.Show(key[i]); - Выдает значения по порядку, но мне так не нужно...

Hermein
28.06.2011, 15:03
что такое i-это элементы по порядку массива
раз чушь выдает, следовательно делаем так:

// Получаем ответ
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
//Получаем html-код страницы
string html = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
string[] key = html.Split();
string newstring="";
for (int i = 0; i < key.Length; i++)
{
if (key[i].IndexOf("<num>") != -1)
{
key[i] = Regex.Replace(key[i], @"\D", string.Empty);
newstring+=key[i]+"/n";
}
}
MessageBox.Show(newstring);//это чтобы посмотреть какие элементы тебе нужны
string[] stringSeparators = new string[] { "\n" };
key = newstring.Split(stringSeparators, stringSplitOptions.RemoveEmptyEntries);
label16.Text = key[0];
label17.Text = key[1];
label18.Text = key[2];
label19.Text = key[3];
label20.Text = key[4];

XRASER
28.06.2011, 17:32
что такое i-это элементы по порядку массива
раз чушь выдает, следовательно делаем так:

// Получаем ответ
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
//Получаем html-код страницы
string html = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
string[] key = html.Split();
string newstring="";
for (int i = 0; i < key.Length; i++)
{
if (key[i].IndexOf("<num>") != -1)
{
key[i] = Regex.Replace(key[i], @"\D", string.Empty);
newstring+=key[i]+"/n";
}
}
MessageBox.Show(newstring);//это чтобы посмотреть какие элементы тебе нужны
string[] stringSeparators = new string[] { "\n" };
key = newstring.Split(stringSeparators, stringSplitOptions.RemoveEmptyEntries);
label16.Text = key[0];
label17.Text = key[1];
label18.Text = key[2];
label19.Text = key[3];
label20.Text = key[4];

Элемент "stringSplitOptions" не существует в текущем контексте.
// Получаем ответ
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
//Получаем html-код страницы
string html = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
string[] key = html.Split();
string newstring = "";
for (int i = 0; i < key.Length; i++)
{
if (key[i].IndexOf("<num>") != -1)
{
key[i] = Regex.Replace(key[i], @"\D", string.Empty);
newstring += key[i] + "/n";
}
}
MessageBox.Show(newstring);//это чтобы посмотреть какие элементы тебе нужны
string[] stringSeparators = new string[] { "\n" };
key = newstring.Split(stringSeparators, stringSplitOptions.RemoveEmptyEntries);
label16.Text = key[0];
label17.Text = key[1];
label18.Text = key[2];
label19.Text = key[3];
label20.Text = key[4];

Hermein
28.06.2011, 18:09
key = newstring.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);

BinKz
19.07.2011, 23:03
Код:

string res;
private string parse(string text, string ind1, string ind2)
{ res = "";
string[] stringSeparators = new string[] { "\n" };
string[] result = text.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);
foreach (string stroka in result)
{if (stroka.IndexOf(ind1) != -1)
{string[] Moneyy = stroka.ToString().Split((Convert.ToChar(">")));
res = Moneyy[1].Replace(ind2, "");
}
}
return res;
}
private void button3_Click(object sender, EventArgs e)
{String secondStepForm = "method=getFriendModels" + "&user=" + textBox1.Text + "&key=" + textBox2.Text + "&friend%5Fuid=" + textBox3.Text;
[Ссылки могут видеть только зарегистрированные и активированные пользователи] request = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])WebRequest.Create("[Ссылки могут видеть только зарегистрированные и активированные пользователи]");
request.UserAgent = "Opera/9.80";
request.Method = "POST";
request.ContentType = "application/x-[Ссылки могут видеть только зарегистрированные и активированные пользователи]";
byte[] EncodedPostParams = Encoding.ASCII.GetBytes(secondStepForm);
request.ContentLength = EncodedPostParams.Length;
request.GetRequestStream().Write(EncodedPostParams , 0, EncodedPostParams.Length);
request.GetRequestStream().Close();
// Получаем ответ
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
string html = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
string boss1 = parse(html, "<boss id=\"1\">", "</boss");
string boss2 = parse(html, "<boss id=\"2\">", "</boss");
string boss3 = parse(html, "<boss id=\"3\">", "</boss");
string boss4 = parse(html, "<boss id=\"4\">", "</boss");
string boss5 = parse(html, "<boss id=\"5\">", "</boss");
richTextBox1.Text += "Кирпич:" + boss1 + "\n" + "Сизый:" + boss2 + "\n" + "Махно:" + boss3 + "\n" + "Лютый:" + boss4 + "\n" + "Шайба:" + boss5 + "\n";
}

Процедура parse и вывод инфы о боссах в richTextbox1 по нажатию button3
Вставил этот код выводит не правильное кол-во смертей кирпич пишет что 20 хотя у меня 600 остальных вообще пишет что 0 в чем может быть проблема? через чарлик смотрел там все норм с количеством

Hermein
22.07.2011, 03:34
Вставил этот код выводит не правильное кол-во смертей кирпич пишет что 20 хотя у меня 600 остальных вообще пишет что 0 в чем может быть проблема? через чарлик смотрел там все норм с количеством

Значит что-то не так делаешь.
Потому что работает данный код /problem

fesssi
22.07.2011, 07:42
Вставил этот код выводит не правильное кол-во смертей кирпич пишет что 20 хотя у меня 600 остальных вообще пишет что 0 в чем может быть проблема? через чарлик смотрел там все норм с количеством

Если так : ЗНАЧИТ эти ключи встречаются раньше и у них другие значения.


ДА и как по мне пользуйте class REGEX + РЕГУЛЯРКИ и получите качественный парсинг на шарпе

Rhino1234
31.07.2011, 22:03
Hermein, распиши тему по-подробнее а то у тябя хорошо получилось но есть свои НО так получается что у тебя какой-то xml парсер ))) а если например парсер на слова "Message" : 300 которые находятся в середине текста размером в 1000 слов

MCseller
31.07.2011, 22:46
Если так : ЗНАЧИТ эти ключи встречаются раньше и у них другие значения.
ДА и как по мне пользуйте class REGEX + РЕГУЛЯРКИ и получите качественный парсинг на шарпе

Качественный парсинг xml/json/etc это парсинг с применением встроенных парсеров, но уж точно не регулярки

Xottab-DUTY
11.12.2011, 13:39
дайте плиз код, когда через IndexOf парсиш, если нету такого, то чтобы не выдавало ошибку)

Hermein
11.12.2011, 15:13
дайте плиз код, когда через IndexOf парсиш, если нету такого, то чтобы не выдавало ошибку)
Код, приведенный в 1 посте полностью рабочий, если руки не от туда растут, то здесь уже никто не поможет

Xottab-DUTY
11.12.2011, 17:02
если руки не от туда растут
растут оттуда)
ну к примеру я ищу <br>ui</br>
а если этого в коде вообще нет, выдает ошибку. Или не должно? :D

Hermein
11.12.2011, 22:07
выдает ошибку
Просто процедурку меняем и вуаля:
string res;
private string parse(string text, string ind1, string ind2)
{
res = "";//зануляем
try{ string[] stringSeparators = new string[] { "\n" };
string[] result = text.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);
foreach (string stroka in result)
{if (stroka.IndexOf(ind1) != -1)
{string[] Moneyy = stroka.ToString().Split((Convert.ToChar(">")));
res = Moneyy[1].Replace(ind2, "");
}
}}catch{MessageBox.Show("Не найдено");res="-";}
return res;
}

nicolaiv007
14.01.2012, 09:57
сложние скрипты

Sleepy_Master
31.01.2012, 21:31
Качественный парсинг xml/json/etc это парсинг с применением встроенных парсеров, но уж точно не регулярки
Насмешил , почитай Дж. Фридла Регулярные выражения 3-изд. Сразу поймешь как глубоко ты заблуждался.

Puzer
31.01.2012, 23:00
Насмешил , почитай Дж. Фридла Регулярные выражения 3-изд. Сразу поймешь как глубоко ты заблуждался.
Если есть чёткая структура документа и есть специализированный класс для обработки этих файлов ты будешь использовать регулярки?
Мне кажется проще инициализировать класс и работать с ним, чем сначала парсить теги и потом...
Если документ имеет нечёткую структуру, то конечно лучше использовать регэкспу (по крайней мере лучше чем IndexOf Split и т.д.).
Могу посоветовать сайты:
Бибилотека ругулярок ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
Применение регулярок к тексту онлайн ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

Hermein
02.02.2012, 15:33
лучше использовать регэкспу (по крайней мере лучше чем IndexOf Split и т.д.).
А теперь аргументируй, а не ссылайся на то что пишут всякие школьники в интернете, скорость работы намного меньше у регексов, жрут нереальные объяемы памяти, неудобная структура, новый using подключать, ну уж нет, спасибо!

Puzer
02.02.2012, 17:48
А теперь аргументируй, а не ссылайся на то что пишут всякие школьники в интернете, скорость работы намного меньше у регексов, жрут нереальные объяемы памяти, неудобная структура, новый using подключать, ну уж нет, спасибо!
Не думаю что школьники пишут про регулярные выражения.

Скорость работы у них выше чем у обычных стринговых функций (можете проверить)
Адаптивность. Допустим обернут нужную вам ссылку в и посмотрите, останется ли ваш код работоспособным. С регэкспой этого можно избежать.
[B]Портируемость. Допустим нашли мы на сайте майла регулярку для проверки пароля на корректность, можем спокойно всовывать в программу без изменений.
Читаемость. да да, для тех кто знает обозначения символов-джокеров понять что делает регулярка не составит труда, в отличии от кучи последовательных index slpit etc.

:pif: /bonk

Sinyss
02.02.2012, 18:45
Не думаю что школьники пишут про регулярные выражения.

Скорость работы у них выше чем у обычных стринговых функций (можете проверить)
Адаптивность. Допустим обернут нужную вам ссылку в и посмотрите, останется ли ваш код работоспособным. С регэкспой этого можно избежать.
[B]Портируемость. Допустим нашли мы на сайте майла регулярку для проверки пароля на корректность, можем спокойно всовывать в программу без изменений.
Читаемость. да да, для тех кто знает обозначения символов-джокеров понять что делает регулярка не составит труда, в отличии от кучи последовательных index slpit etc.

:pif: /bonk
Я конечно не специалист, но я на 95% уверен что работа регулярок происходит через последовательный подбор символов, как и операции со строками... Только в случае регулярок ты задаешь алгоритм поиска нужного тебе фрагмента на особом языке, который надо еще распарсить, построить древо вывода и тд. причем все это будет висеть в оперативке. Обычная же работа со строками выполняется последовательно и в оперативке будет висеть только текст с которым работаем и символ(подстрока) который ищем.
Читаемость тут не аргумент, поскольку выполнение простой задачи через регулярки будет подобно забиванию гвоздя микроскопом, а сложная задача будет точно так же не читаема как и реализация через строки... (не говоря уже о том что требует от программиста знания регулярок, которое не является базовым...).
Адаптивность: если писать нормально то все будет нормально....

Puzer
02.02.2012, 19:05
Я конечно не специалист, но я на 95% уверен что работа регулярок происходит через последовательный подбор символов, как и операции со строками...
Поперхнулся.
В регулярных выражениях используются 3 алгоритма поиска строки по шаблону,основные это NFA ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) и DFA ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) и это никак не последовательный подбор символов

Sinyss
02.02.2012, 19:12
Поперхнулся.
В регулярных выражениях используются 3 алгоритма поиска строки по шаблону,основные это NFA ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) и DFA ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) и это никак не последовательный подбор символов
Я тебя разочарую, по факту оно идет через последовательный подбор, просто вот эти автоматы строятся регуляркой, а не программистом... выигрыша в скорости они не дают...
Как работают эти автоматы: перебираем символы пока не найдется такой который переведет автомат во 2е состояние, потом в 3е и тд. т.е. тупо проход по строке... так же как и у строк
PS: под "подбором" я имел ввиду что мы проходим по строке и сравниваем символы...

Puzer
02.02.2012, 19:24
Я тебя разочарую, по факту оно идет через последовательный подбор, просто вот эти автоматы строятся регуляркой, а не программистом... выигрыша в скорости они не дают...
Как работают эти автоматы: перебираем символы пока не найдется такой который переведет автомат во 2е состояние, потом в 3е и тд. т.е. тупо проход по строке... так же как и у строк
PS: под "подбором" я имел ввиду что мы проходим по строке и сравниваем символы...
Но перебор идёт не всех символов, в отличии от IndexOf
И думаешь программист построит код лучше и эффективней чем машина?

Возвращаясь к теме, на практике парсить html страничку лучше регуляркой, и это будет быстрее, я с этим сталкивался и задавался этим вопросом.

Sinyss
02.02.2012, 19:32
Но перебор идёт не всех символов, в отличии от IndexOf
И думаешь программист построит код лучше и эффективней чем машина?

Возвращаясь к теме, на практике парсить html страничку лучше регуляркой, и это будет быстрее, я с этим сталкивался и задавался этим вопросом.
Вообще то всех...
Да, поскольку он задает точные, команды(которые будет после еще оптимизированны компилятором), а регулярка будет еще строить этот автомат, держать в памяти все состояния и переходы...

•theSaboteur•
02.02.2012, 21:23
последовательный подбор символов
"Перебор" пожалуйста, если вам не трудно, а то передергивает..
который надо еще распарсить
Никто не запрещает заранее скомпилировать регулярку (RegexOptions.Compiled)
никак не последовательный подбор символов
1. "Перебор", будьте так любезны
2. Ай?! Чаво? Ну-ка просветите, они должно быть молятся, в ожидании маны небесной?

Во избежание холиваров и вытекающих из них баттхёртов , перед публикацией последующих постов прошу всех желающих ознакомиться:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Далее:
1. IndexOf возвращает первое вхождение подстроки, либо -1 в случае отсутствия оной. Еще раз - если искомая подстрока имеет место, то функция по всей строке не проходит. мелкомягкие все-таки тоже не мyдаки..
2. Регекспы в случае с dfa машинами проходят всю строку, поскольку ищет самое длинное соответствие. При nfa алгоритме все еще сложнее - из-за возвратов. Ищет первое вхождение подстроки. posix nfa - тоже самое, ищет самое длинное вхождение. .Netовская реализация представляет собой лучшие (по заверениям мелкософта) функции nfa машины + полезная "отсебятина".
=> реги в принципе не могут быть быстрее цикла сверяющего конкретное с конкретным.
3. Регулярки это удобно, и не надо извращаться, вы не заметите разницы во скорости между работой реги и вашего, написанного, очевидно, среди ночи, (о вас не знаю и судить не могу, но в подавляющем большинстве случаев 6ыдло-) кода.
4. Использование регулярных выражений уберегает вас от множества ошибок, и болезненных ощущений в нижней части позвоночника - при написании велосипедов случайно поставленный злобным юзером пробел подле какой-нибудь скобки ой-ей-ей как подпортит вам кровушку, когда вы будете ломать голову - от чего ж этот ваш "сверхскоростной" парсер игнорирует сию строку, а заметить тот самый пробел пол-пятого ночи ваш мозг не пожелает, более чем уверен.
5. Если есть готовый класс для работы с имеющими свою четкую структуру - используйте его, не стесняйтесь, это вовсе не грех, а от задержки в миллион-другой колебаний процессора этот нахальный пользователь не умрет.. А вот вы сможете поспать на пару часов дольше.

Добавлено через 6 минут
держать в памяти все состояния и переходы
Сколько у вас ram?)
А на буржуйских машинках ставят по 8, по 16 GiB.. XXI век как-никак, на серверах овер 128GiB озу, вы несколько килобайтов жалеете?

Hermeska
03.02.2012, 00:51
вы несколько килобайтов жалеете?
Из килобайт вырастают мегабайты, для 1 сайта делал парсер - практический пример страница там в районе 600кб - не мало, верно? Простыми IndexOf-ами, Split-ами и тп. парсится все в доли секунд с выделением памяти в 6-8 метров на 10 таких страничек, но забыл "убивать" отработанное и составили потери в 4-8 метров, но как же я был убит, когда я начитавшись про регексы, какая эта крутая вещь и тд и тп решил потестить, извините, для нетбука 80-120 метров со страниц в 600 кб - это уже перебор, в конечном итоге после оптимизации на все 10 страниц вылетало по сравнению с 4-8 метрами 60-90 метров....Да, для супер-пупер машин это раз плюнуть, но для нетбуков это дофига и быдлятский код именно с регексами ИМХО просто так налево и направо раскидываться памятью - признак не ок кодера!

•theSaboteur•
03.02.2012, 14:30
Hermeska, для слабых машин, высоких скоростей и точных вычислений существует си и ассемблер, а дотнет предназначен для упрощения жизни кодера.
Да и регекс составить по-разному можно))

Sinyss
03.02.2012, 14:56
Hermeska, для слабых машин, высоких скоростей и точных вычислений существует си и ассемблер, а дотнет предназначен для упрощения жизни кодера.
Ты этой фразой заявил "C# для *****кода"...
На шарпе можно писать хороший, быстро работающий код, другое дело что он не везде необходим...

•theSaboteur•
03.02.2012, 15:50
Sinyss, Браво!!! Прозвучало очень так.. Очень!
Однако, очевидно - что-то у меня с головой не так,
но в моем представлении эти слова никоим образом нельзя интерпретировать как "C# для гoвнокода".
Прочтите еще раз мой пост, уважаемый, и вы увидите что я лишь высказал мнение,
что .Net значительно облегчает тяжкое бремя программиста,
а от исполняемого виртуальной машиной программного кода нельзя требовать сверхпроизводительности.

Если вдруг, не дай Господи, Вы вновь увидите что-либо связанное с гoвнокодом - могу посоветовать словарь Даля.

Sinyss
03.02.2012, 18:08
дотнет предназначен для упрощения жизни кодера.
Просто кодеру удобней городить *****код, чем писать нормально...
Простой пример:
Лабораторная, суть которой заключается в подсветке всех элементов языка(например паскаль), надо выделять отдельными цветами цифры, строки, коментарии, операции, переменные, зарезервированные слова и тд.
Мой код на входных данных в 1к строчек работал ~секунду(округлено вверх), код одногрупника, построенный на регулярках, на 15 строчках - больше 30 секунд...
Да, его код был более чем понятен, короткий, лаконичный, но это не компенсировало потерь в быстродействии. Он сделал так не потому что не умел по другому, а просто потому что так было УДОБНЕЕ.
Код удобный программисту(в 99% случаев) = говн-код. /horror
Обработка входных текстовых данных через Split, множество регулярок и другие тяжелые структуры возможна, она удобна для программиста, но подайте на вход тяжелый файл и вы заметите что то не так...

Puzer
03.02.2012, 19:12
...Мой код на входных данных в 1к строчек работал ~секунду(округлено вверх), код одногрупника, построенный на регулярках, на 15 строчках - больше 30 секунд...
.


Ну раз перешли на *****кодеров...ты вы им являетесь, как впрочем и ваш друг. /horror Почему? Вы потому что код в 1к строк, основаный не на рациональном варианте. Вы же ещё будете в группе разработчиков работать, вы представляете какого им будет читать ваш код ? Ваш однокурсник выбрал более рациональный алгоритм решения данной задачи, но видно намудрил с объявлениями\регулярками\циклами, в общем не провёл оптимизацию алгоритма.

Лично у меня программы для исправления базы данных, основанная на регулярках, работает со скоростью примерно секунды 1-2 на 300-400 мб файла, при том она полностью изменяет структуру документа. При том через эту программу проходили документы размером в 9 гб (читал БД по кускам правда)

•theSaboteur•
03.02.2012, 20:57
Sinyss, боюсь представить что написал ваш многоуважаемый одногрупник, в частности количество возвратов...
Ранее я уже упоминал - регулярное выражение, равно как и программный код, можно написать по-разному.
Возможно вы поторопились-таки с выводами - это вовсе не плохая технология, пост выше (#54) подтверждение тому.
Кто-то кстати упоминал Фриддла - глянул когда-то пару первых страниц...
Вступление к сожалению отбило у меня желание читать сие произведение - больно много было воды про "мыслить регулярными выражениями" и тому подобного, однако встречал мнение, что книжонка достойная.

Sinyss
03.02.2012, 21:34
Ну раз перешли на *****кодеров...ты вы им являетесь, как впрочем и ваш друг. /horror Почему? Вы потому что код в 1к строк, основаный не на рациональном варианте. Вы же ещё будете в группе разработчиков работать, вы представляете какого им будет читать ваш код ? Ваш однокурсник выбрал более рациональный алгоритм решения данной задачи, но видно намудрил с объявлениями\регулярками\циклами, в общем не провёл оптимизацию алгоритма.

Лично у меня программы для исправления базы данных, основанная на регулярках, работает со скоростью примерно секунды 1-2 на 300-400 мб файла, при том она полностью изменяет структуру документа. При том через эту программу проходили документы размером в 9 гб (читал БД по кускам правда)
Перечитайте мой пост.
Мой алгоритм(без кода GUI и тд.) занимал 40-70 строк(сейчас уже не помню), на вход я подавал 1к строк...
•theSaboteur•, я не говорил что технология плохая, я говорю что злоупотреблять не стоит...

Hermein
04.02.2012, 03:35
Развели бардак!

примерно секунды 1-2 на 300-400 мб файла
это интересно во сколько потоков считывался файл???? или это просто так написать, похвастаться, насколько мы круты!....
Лололо-трололо все только на словах, на практике - удобно вам там с регулярками - идите пишите на них, не надо тут убеждать никого что это круто, модно, быстро и тп чушь нести, вы сначала посмотрите что регулярка делает, в рефлекторе прогоните(для особо долгих)....
Я напишу 2-3 парсера и будет все пахать и летать по чем свет стоит, а ну да чуть не забыл - типо говорили измени в документе что-нибудь и ваш УГ не будет работать, не заьывайте что и в регулярках все задается точно(для долгих - маска регулярки), так что решать каждому самому что выбирать, но аргументы к регуляркам,ИМХО только потому что там думать и париться особо не надо, в отличии от написания своих собственных парсеров, так сказать ЛЕНЬ.

ps: какой-то умник писал что регулярки надо юзать, а не работать со строковыми индексофами сабстрингами и тп... Для него(сам поймет кто) скажу еще раз - посмотри структуру регексов - сколько сот раз они используют Индексофы Сплиты и тд и тп
pps: закройте уже эту тему!

•theSaboteur•
04.02.2012, 15:08
Hermein, читаем посты, читаем внимательно.
типо говорили измени в документе что-нибудь и ваш УГ не будет работать
Где написано такое?))))
Читайте товарищ.
все задается точно(для долгих - маска регулярки),
В регексе достаточно впихнуть всего пару символов, в ситуациях где велосипедописатели пихают по несколько циклов.
И вновь говорю - когда вы будете сидеть в половину пятого ночи, вы напишите такой код, увидев который утром умрете в ужасе.
Конкретно о том злополучном пробеле - написать @"\s*" куда проще чем писать две лишних строчки -_-

Реги позволяют быстро и компактно написать код парса данных и в большинстве случаев они работают с удовлетворительной скоростью.

какой-то умник писал что регулярки надо юзать
Еще раз повторяю - читайте посты, а не фантазируйте, умник.
посмотри структуру регексов
Хоть мельком видели .net'овскую реализацию регулярок?
Может еще и мелкософт начал сорсы в паблик выкладывать?)
После взгляда на ваш пост возникает сомнение по поводу того, что вы сидели с рефлектором:)
Я напишу 2-3 парсера и будет все пахать и летать по чем свет стоит
Вот я встречал несколько раз эдаких вот самописцев - разрыдаться можно при виде ихних "велосипедов"...
сколько сот раз они используют Индексофы
А вы стало быть не используете?
И "дяди" писавшие .нэт не дураки - нужные данные, более чем уверен, хранятся в памяти.
-------------


Все делать самому это конечно хорошо, и к сожалению я этим сильно болею, но надо различать ситуации - порой можно и нужно использовать готовую продукцию, ибо время - это время, его часто не хватает.

Резюме:
Я бы сейчас умер со-смеху, не будь все это так печально.
Очевидно вам, умный человек, не слишком часто приходилось писать код в сжатые сроки...