Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832

Как ускорить парсинг html?

08.06.2016, 11:44. Показов 1843. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Столкнулся с такой проблемой, что парсинг html текста идет очень долго. Посмотрите пожалуйста, как можно оптимизировать код по скорости?
VB.NET
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
On Error Resume Next
        Dim int As Integer
        Dim fintext As String
        int = 0
        Dim html_text As String = WebBrowser1.Document.Body.InnerHtml
        Dim toggle As String
        Dim bool As Boolean
        Dim words As String() = html_text.Split("<SPAN")
        Dim strchar As Char
        For Each lines As String In words
            If bool = True Then
                If int < 5 Then
                    bool = False
                End If
                GoTo plus
            End If
            strchar = lines(14)
            If strchar = "4" Or strchar = "5" Then
plus:
                int = int + 1
                toggle = toggle + lines
                If int > 4 Then
                    'парсинг
                    toggle = toggle + vbNewLine
                    toggle = toggle.Replace("/SPAN>", "")
                    toggle = toggle.Replace("SPAN class=Xb>", "")
                    toggle = toggle.Replace("SPAN Class=Xc4>", "")
                    toggle = toggle.Replace("SPAN class=Xc15>", "")
                    toggle = toggle.Replace("SPAN class=", "")
                    toggle = toggle.Replace("SPAN", "")
                    toggle = toggle.Replace("Xc4", "")
                    toggle = toggle.Replace("Xc0 Xb", "")
                    toggle = toggle.Replace("<", "")
                    toggle = toggle.Replace(">", "")
                    Dim linez As String() = toggle.Split(vbNewLine)
                    For Each linn As String In linez
                        fintext = linn
                        System.IO.File.WriteAllText("everyline.txt", fintext)
                        Dim hash2 As HashSet(Of String) = New HashSet(Of String)
                        Dim file2 As String() = IO.File.ReadAllLines("everyline.txt")
                        For Each item2 As String In file2
                            If item2.StartsWith(4) Then
                                hash2.Add(item2)
                            ElseIf item2.StartsWith(5)
                                hash2.Add(item2)
                            ElseIf item2.StartsWith(3)
                                hash2.Add(item2)
                            ElseIf linn.Contains("APP")
                                hash2.Add(item2)
                            ElseIf linn.Contains("$")
                                hash2.Add(item2)
                            End If
                        Next
                        IO.File.WriteAllLines("filtered.txt", hash2.ToList())
                    Next
 
 
                  
 
                End If
                        bool = True
            End If
        Next
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.06.2016, 11:44
Ответы с готовыми решениями:

Парсинг HTML
Здравствуйте, у меня есть HTML страница вк, там контейнеры с сообщениями: &lt;div class=&quot;msg msg_id_767217 msg_unread&quot;...

Как можно ускорить парсинг XML
Всем добра) Процедура получает на вход XML файл достаточно большого размера(в зависимости от ситуации). Изначально такая процедура была...

Ускорить парсинг страницы
Всем привет. Пишу парсер, все ок, все работает. Но, работает ДОЛГО. На одну функцию уходит больше 2 секунд, а их там 4 -_- from bs4...

14
646 / 474 / 39
Регистрация: 04.11.2013
Сообщений: 1,951
08.06.2016, 13:08
Вот этот кусок через regex можно оптимизировать, но тормозит, скорее всего, не он, а запись и тут же чтение файла everyline.txt.

VB.NET
1
2
3
4
5
6
7
8
9
10
11
                    toggle = toggle + vbNewLine
                    toggle = toggle.Replace("/SPAN>", "")
                    toggle = toggle.Replace("SPAN class=Xb>", "")
                    toggle = toggle.Replace("SPAN Class=Xc4>", "")
                    toggle = toggle.Replace("SPAN class=Xc15>", "")
                    toggle = toggle.Replace("SPAN class=", "")
                    toggle = toggle.Replace("SPAN", "")
                    toggle = toggle.Replace("Xc4", "")
                    toggle = toggle.Replace("Xc0 Xb", "")
                    toggle = toggle.Replace("<", "")
                    toggle = toggle.Replace(">", "")
Типа, как-то так, работоспособность не проверял
VB.NET
1
2
3
Dim RG As Regex = New Regex("(/SPAN\>|SPAN class\=Xb\>|SPAN Class\=Xc4\>|SPAN class\=Xc15\>|SPAN class\=|SPAN|Xc4|Xc0 Xb|/<|/>)")
toggle = toggle + vbNewLine
toggle = RG.Replace(toggle, "")
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18294 / 14218 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
08.06.2016, 13:20
ziqp, что именно должен делать код? Выбрать все тексты внутри тегов SPAN?
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
08.06.2016, 14:55  [ТС]
Proidoha, спасибо за код. Обязательно протестирую что быстрее.
OwenGlendower, код должен выбирать данные из span и обрабатывать по маске (с масками работать не умею, все через split и т. д.).
Но главная мысль в том, чтобы если нашлись данные которые мне нужны*, следующие 3 значения из следующих span должны соединяться в одну строку + те данные*
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18294 / 14218 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
08.06.2016, 15:08
ziqp, тогда начни с использования встроенных методов для выбора элементов. Ведь WebBrowser представляет документ в виде дерева (т.н. DOM модель) с которой работать удобнее чем со строками. Например такой код вернет список всех span-ов на странице:
VB.NET
1
Dim spans As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("span")
2
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
08.06.2016, 16:35  [ТС]
Извини, завел в заблуждение. Такую вещь я уже использовал, если между тегов, то берет отлично. Здесь это не прокатывает. html в таком виде:
HTML5
1
<SPAN class=Xb>текст 1 </SPAN><SPAN>текст 2 - </SPAN><SPAN class=Xc4>текст 3</SPAN><SPAN> </SPAN><SPAN class=Xc15>текст 4 </SPAN><SPAN class="Xc15 Xb">текст 5 </SPAN><SPAN class=Xc15>текст 6</SPAN></DIV>
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18294 / 14218 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
08.06.2016, 16:55
ziqp, html выглядит простым. По идее проблем быть не должно. Что именно с ним не прокатывало?
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
10.06.2016, 16:48  [ТС]
А проблема вот в чем:
VB.NET
1
2
3
4
5
6
7
8
Dim spans As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("html")
        Dim zzz As New StringBuilder
        For i = 0 To spans.Count - 1
            Dim cc As String
            cc = (spans(i).GetAttribute("span"))
            zzz.AppendLine(cc)
        Next
        IO.File.WriteAllText("dorr.txt", zzz.ToString, Encoding.Default)
Таким образом выдает пустые результаты.
Возможно проблема в cc = (spans(i).GetAttribute("span")), но по-другому пишет, что htmlelement невозможно перенести в string
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4358 / 3428 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
11.06.2016, 20:12
а .GetAttribute("span") вроде имеет свойство VALUE, вот оно наверно должно возвращаться?
VB.NET
1
cc = spans(i).GetAttribute("span").Value
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18294 / 14218 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
12.06.2016, 07:27
ziqp, ты неправильно работаешь с DOM. Во-первых, тебе нужны элементы span, а не html (который к тому же всегда один). Во-вторых, ты путаешь атрибуты с элементами. Атрибут это пара имя=значение внутри открывающего тега. Например, в записи <SPAN class=Xb> у span'а есть один атрибут с именем class и имеющий значение Xb. Судя по коду выше тебя интересуют не атрибуты, а текст внутри элемента. Его можно получить через InnerText. В итоге код будет такой:
VB.NET
1
2
3
4
5
6
7
Dim spans As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("span")
Dim zzz As New StringBuilder
For i = 0 To spans.Count - 1
    Dim cc As String = spans(i).InnerText
    zzz.AppendLine(cc)
Next
IO.File.WriteAllText("dorr.txt", zzz.ToString, Encoding.Default)
2
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
12.06.2016, 11:03  [ТС]
Спасибо. В этом разобрался.
Но появилось новое исключение.
После Dim cc As String = spans(i).InnerText
записал: If cc.Length = 16 Then
Необработанное исключение типа "System.NullReferenceException" при исполнении
Если записать в начала On error resume next, ошибка пропадает и все работает корректно, но не уверен, что это правильное решение

Добавлено через 34 минуты
+ нашел то, что сильно тормозит процесс обработки:
Быстро:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
        Dim hash2 As HashSet(Of String) = New HashSet(Of String)
        Dim file2 As String() = IO.File.ReadAllLines("dorr.txt")
        For Each item2 As String In file2
            If item2.StartsWith(4) Then
                hash2.Add(item2)
            ElseIf item2.StartsWith(5) Then
                hash2.Add(item2)
            ElseIf item2.StartsWith(3) Then
                hash2.Add(item2)
            End If
        Next
В 10 раз дольше:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
        Dim hash2 As HashSet(Of String) = New HashSet(Of String)
        Dim file2 As String() = IO.File.ReadAllLines("dorr.txt")
        For Each item2 As String In file2
            If item2.StartsWith(4) & item2.Contains("nks") Then
                hash2.Add(item2)
            ElseIf item2.StartsWith(5) & item2.Contains("nks") Then
                hash2.Add(item2)
            ElseIf item2.StartsWith(3) & item2.Contains("nks") Then
                hash2.Add(item2)
            End If
        Next
Добавлено через 1 минуту
+ к этому еще и портит результаты. Что-то в этом условии не то..

Добавлено через 3 минуты
Добиться хотел я такого результата, но это уже совсем другое:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        For Each item2 As String In file2
            If item2.StartsWith(4) Then
                If item2.Contains("nks") Then
                    hash2.Add(item2)
                End If
            ElseIf item2.StartsWith(5) Then
                If item2.Contains("nks") Then
                    hash2.Add(item2)
                End If
            ElseIf item2.StartsWith(3) Then
                If item2.Contains("nks") Then
                    hash2.Add(item2)
                End If
            End If
        Next
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18294 / 14218 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
12.06.2016, 13:09
Цитата Сообщение от ziqp Посмотреть сообщение
Но появилось новое исключение.
После Dim cc As String = spans(i).InnerText
записал: If cc.Length = 16 Then
Необработанное исключение типа "System.NullReferenceException" при исполнении
Очевидно сс равно Nothing (null). Добавь проверку на Nothing или сделай так:
VB.NET
1
Dim cc As String = If(spans(i).InnerText, "")
Цитата Сообщение от ziqp Посмотреть сообщение
+ нашел то, что сильно тормозит процесс обработки:
Ну если три раза вызывать один и тот же метод
VB.NET
1
item2.Contains("nks")
, то ничего удивительного.
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
12.06.2016, 16:50  [ТС]
с нулевым значение понял.
А с методом, наверное, недопонимание:
Я хочу, чтобы программа выполняла так:
VB.NET
1
2
3
4
5
If item2.StartsWith(4) Then
                If item2.Contains("nks") Then
                    hash2.Add(item2)
                End If
End If
Но если написать это так:
VB.NET
1
2
3
If item2.StartsWith(4) & item2.Contains("nks") Then
                hash2.Add(item2)
End If
Тогда условие "отключается" (не выполняется, проходят все значения) и сильно тормозит.
От чего это и в чем проблема?
0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
12.06.2016, 17:08
& это знак конкатенации строк

может написать andAlso ?
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18294 / 14218 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
12.06.2016, 17:16
Лучший ответ Сообщение было отмечено ziqp как решение

Решение

ziqp, проверку можно сделать один раз и затем уже делать дальнейшие действия. Например, так:
VB.NET
1
2
3
4
5
6
7
8
For Each item2 As String In file2
    If item2.Contains("nks") Then
        Select Case item2(0)
            Case "3","4","5"
                hash2.Add(item2)
        End Select
    End If
Next
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.06.2016, 17:16
Помогаю со студенческими работами здесь

Как реализовать html парсинг?
некто мне подскажет как реализовать парсинг а именно мне надо в штмлке заменит имя файла картинки на имя сервлета берщего эту...

Как и чем делать парсинг HTML?
Подскажите как и чем. Простого примерчика будет достаточно.

Парсинг делают одновременно со скачиванием html, или в конце со скачанным html
Представим что html байт за байтом записывается в файл, Как правильнее сделать парсинг , после того как будет скачан полностью весь html,...

Парсинг HTML (HtmlAgilityPack). Как получить картинку между текстом?
Пример HTML &lt;p class=&quot;left_margin&quot;&gt; 5) &lt;img src=&quot;https://sait.ru/formula/svg/8b/8b847cfae498e96e3fa08a56cb42b838.svg&quot;...

Qt парсинг html. Вытащить html код тэга?
QWebElementCollection collection = frame-&gt;findAllElements(&quot;div&quot;); foreach (QWebElement element, collection) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru