powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Парсинг больших стрингов.
25 сообщений из 30, страница 1 из 2
Парсинг больших стрингов.
    #38237785
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я хочу парсить HTML страницы. Сегодня делаю так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
    WebClient myWebClient = new WebClient();
    html_source = myWebClient.DownloadString(address);
   sr = new StreamReader( html_source);
   using (sr)
   {
        //тут я делаю парсинг
   }



Когда страниц 1-10 все нормально, когда 100-500 приходиться долго ждать.
Есть ли какой нибудь более быстрый способ?
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38237796
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведенные цифры ничего не доказывают. Ищи проблему в алгоритме парсинга строки html документа, а не в самой строке.
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38237821
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
то есть в принципе можно использовать StreamReader?
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38237838
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7то есть в принципе можно использовать StreamReader?
Кто-то скручивает руки и запрещает это делать?
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38237850
WPF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7то есть в принципе можно использовать StreamReader?Есть другая альтернатива? Совет: не пользуйтесь регулярками, скорость возрастет.
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38237877
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WPFjenya7то есть в принципе можно использовать StreamReader?Есть другая альтернатива? Совет: не пользуйтесь регулярками, скорость возрастет.
А как сделать сплит по стрингу без регулярки?
Я делаю так:
Код: c#
1.
string[] str_arr = Regex.Split(str, "article class=\"oMed\"");
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38237885
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38237906
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо, буду пробовать.
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38237914
WPF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7спасибо, буду пробовать.Если html валидный, попробуй распарсить его в xml
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38237940
carrotik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

.. кстати, в некоторых случаях быстрее получается сначала использовать метод ReadLine в StreamReader-e и парсить отдельные строки, нежели всю страницу целиком ...
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38237966
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7WPFпропущено...
Есть другая альтернатива? Совет: не пользуйтесь регулярками, скорость возрастет.
А как сделать сплит по стрингу без регулярки?
Я делаю так:
Код: c#
1.
string[] str_arr = Regex.Split(str, "article class=\"oMed\"");


Применить RegexOptions.Compiled

?
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38237986
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Html Agility Pack в помощь.
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38237989
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

если не путаю, Regex кэшируется.

авторНачиная с платформы .NET Framework 2.0 кэшируются только регулярные выражения, используемые в вызовах статических методов.

По умолчанию обработчик регулярных выражений кэширует 15 последних использованных статических регулярных выражений.
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38238006
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я думал про Html Agility Pack. Вопрос так ли он ускоряет процесс парсинга?
Узким местом тут конечно является алгоритм, оптимальные сплиты, вытаскивание сабстрингов и.т.д.
Сабстринг я кстати вытаскиваю так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public string GetSubString(string str, string start_marker, string end_marker)
        {
            string substr = "";
            int start_index = str.IndexOf(start_marker) + start_marker.Length;
            if (string.IsNullOrEmpty(end_marker))
            {
                substr = str.Substring(start_index);
            }
            else
            {
                int stop_index = str.IndexOf(end_marker, start_index);
                substr = str.Substring(start_index, stop_index - start_index);
            }
            return substr;
        }


А сплит я сделал так
Код: c#
1.
2.
  string[] separators = new string[] { "split token" };
  string[] str_arr = str.Split(separators, StringSplitOptions.None);
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38238051
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Я думал про Html Agility Pack. Вопрос так ли он ускоряет процесс парсинга?
Возьми и проверь.
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38239383
sld
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sld
Гость
может дело то не в парсинге, а у кого то инет хреновый, или загружаемые странички расположены на тормозных сайтах.
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38239488
ЫLL HEAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
парсю регэкспом. по ~10000 страниц зараз. скоростm парсинга строки вообще значения не имеет т.к. частоту чтения страниц специально понижаю, иначе некоторые банят по ипу.
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38242897
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sldможет дело то не в парсинге, а у кого то инет хреновый, или загружаемые странички расположены на тормозных сайтах.
ну не знаю, не знаю....страницы загружаються мгновенно.

ЫLL HEADпарсю регэкспом. по ~10000 страниц зараз. скоростm парсинга строки вообще значения не имеет т.к. частоту чтения страниц специально понижаю, иначе некоторые банят по ипу.

можете привести пример?
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38242898
ЫLL HEAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пример чего

вашего языка не знаю (1)

алгоритмтм изложен (2)

пишите как хотите
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38242902
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я уже несколько дней сижу и упираюсь в именно в проблему парсинга.
1. Сначала разбиваю страницу на секции. В каждой секции данные пользователя.
Код: c#
1.
2.
3.
4.
5.
6.
private string[] SplitSections(string html_page)
{
     string[] separator = new string[] { "article class=\"oMed\"" };
     string[] str_arr = html_page.Split(separator, StringSplitOptions.None);
     return str_arr;
}


2. Потом нужно парсить каждую секцию и вытащить данные.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
for (int j = 1; j < sections.Length; j++)  //j = 1 to skip header section
{
    freelancer = html_parser.ParseSection(sections[j]);
    if (freelancer != null)
    {
        if (ApplyFilter(ref freelancer))  //search parameters
           PopulateData(ref freelancer);
    }
}

public Freelancer ParseSection(string section)
{
    string strline = "";
    Freelancer freelancer = new Freelancer();
    sr = new StringReader(section);
    using (sr)
    {
         while ((strline = sr.ReadLine()) != null)
         {
             ParsePersonalInfo(strline, ref freelancer);
         }
    }
    return freelancer;
}

public void ParsePersonalInfo(string str, ref Freelancer freelancer)
        {
            //get person name
            if (str.Contains("\"name\">"))
            {
                freelancer.Name = GetSubString(str, "name\">", "</span");
            }
            //get person rate per hour
            if (str.Contains("oRate"))
            {
                string temp_str = GetSubString(str, "\">", "/hr");
                string rate = temp_str.Substring(1); //remoove $ sign
                freelancer.Rate = Convert.ToDouble(rate);
            }
            //get person total working hours
            if (str.Contains("oHrs"))
            {
                freelancer.Hours = Convert.ToInt16(GetSubString(str, "\">", "</span"));
            }
            //get person location
            if (str.Contains("oLocation"))
            {
                freelancer.Location = GetSubString(str, "\">", "</span");
            }
            //get person last active date
            if (str.Contains("Last active"))
            {
                string date = GetSubString(str,"datetime=\"","\">");
                freelancer.LastActive = Convert.ToDateTime(date);
            }
            //get person portofilio count
            if (str.Contains("oPortfolioItems"))
            {
                freelancer.PortfolioItems = Convert.ToInt16(GetSubString(str, "\">", "</span"));
            }
            //get person tests count
            if (str.Contains("oTestsCount"))
            {
                freelancer.TestsCount = Convert.ToInt16(GetSubString(str, "\">", "</span"));
            }
            //get person description
            if (str.Contains("<p>")) //start of paragraph
            {
                section = Sections.Description;
            }
            if (section == Sections.Description)
            {
                freelancer.ContractorDescription += str;
            }
            if (str.Contains("</p>")) //end of paragraph
            {
                freelancer.ContractorDescription += str;
                section = Sections.None;
            }
            //get person skills
            if (str.Contains("oSkillsList"))
            {
                section = Sections.Skills;
            }
            if (section == Sections.Skills)
            {
                if (str.Contains("oTag oSkill"))
                {
                    freelancer.Skills += GetSubString(str, ">", "</") + ",";
                }
                if (str.Contains("oMoreSkills"))
                {
                    section = Sections.None;
                }
            }
            //get person stars
            if (str.Contains("oStars"))
            {
                string substr = GetSubString(str, "title=\"", " S");
                freelancer.Stars = Convert.ToDouble(substr);
            }
        }


и так 500 страниц. сидел над каждой строчкой, не нашел способа оптимизировать.
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38242950
sld
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sld
Гость
наставь временных меток и понятно будет в каком месте тормозит
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38242968
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Я думал про Html Agility Pack. Вопрос так ли он ускоряет процесс парсинга?

Точных замеров не делал, но на глаз ускоряет, и удобно.
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38242976
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
временные метки это интересно, надо попробовать.

насчет Html Agility Pack, насколько я понял, дает удобство и компактность кода, скорость парсинга не увеличивается.
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38242997
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Парсинг больших стрингов.
    #38243006
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУ 14223565

в любом парсинге мы придем к низкоуровневым операциям:
Contains(), Split(), InexOf(), Substring(),StartsWith(),EndsWith()
все остальное это красивые обертки - нужные, удобные, но не прибавляющие скорости.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Парсинг больших стрингов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]