purebasic.info

PureBasic forum
Текущее время: Ср сен 26, 2018 4:06 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: HTML Парсинг страниц
СообщениеДобавлено: Вт мар 27, 2018 9:25 pm 
Не в сети
доцент

Зарегистрирован: Пн мар 05, 2018 4:49 am
Сообщений: 50
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Есть код, http://www.purebasic.fr/english/viewtopic.php?t=66256 у него утечка памяти. Посмотрев код, вроде везде где выделяется память - высвобождается, но может быть и нет. Т.к я не могу сам найти, прошу вашей помощи.

Код который я использую.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    If HtmlReceive(u) ; ссылка на страницу
        While HtmlNext()
            Select HtmlTag()
                Case "textarea"
                    name.s = HtmlAttribute("name")
                    id.s = HtmlAttribute("id")
                    tabindex.s = HtmlAttribute("tabindex")
                    If Left(name, 4) = "file" And Left(id, 4) = "file" And Left(tabindex, 8)
                        ProcedureReturn HtmlText()
                    EndIf
            EndSelect
        Wend
        ProcedureReturn "False"
    EndIf



Написал в дополнение две функции, но и они с утечкой.
Одна использует либу Autoit.
Код:
1
2
3
4
5
6
    Protected Dim match.s(0)
    StringRegExp3(match(), HTML_Parser(u), "\>(.*?)<\/textarea>")
    If Not _Error()
        ProcedureReturn match(0)
    EndIf
    ProcedureReturn "False"



Вторая дефолтное api пурика.
Код:
1
2
3
4
5
6
7
8
9
    Protected str.s = "False"
    CreateRegularExpression(0, "\>(.*?)<\/textarea>")
    If ExamineRegularExpression(0, HTML_Parser(u))
        While NextRegularExpressionMatch(0)
            str = RegularExpressionGroup(0, 1)
            Break
        Wend
    EndIf
    ProcedureReturn str



и там и так утечки, правда в первом варианте с использованием аутоит либы, утечки чуть меньше.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Procedure.s HTML_Parser(u.s)
    If InitNetwork()
        Protected Size.l
        Protected *HTMLBuffer, HTMLString.s
        *HTMLBuffer = ReceiveHTTPMemory(u)
        If *HTMLBuffer
            Size = MemorySize(*HTMLBuffer)
            HTMLString = PeekS(*HTMLBuffer, Size, #PB_UTF8|#PB_ByteLength)
            FreeMemory(*HTMLBuffer)
        EndIf
        ProcedureReturn HTMLString
    EndIf
    ProcedureReturn "False"
EndProcedure



Все, вроде пофиксил.
Код:
1
2
3
4
5
6
7
8
Global NewMap MemoryAddresses()
Global IsMemory_Mutex = CreateMutex()
Procedure _FreeMemory(*Memory)
        FreeMemory(*Memory)
        LockMutex(IsMemory_Mutex)
        DeleteMapElement(MemoryAddresses(), Str(*Memory))
        UnlockMutex(IsMemory_Mutex)
EndProcedure



з.ы ну я и параноик...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: HTML Парсинг страниц
СообщениеДобавлено: Ср мар 28, 2018 4:52 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2285
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
В настройках компиляции поставь ThreadSafe. Если выделяется память, то помимо её FreeMemory(), стоит еще обнулить указатель:
Код:
1
2
FreeMemory(*mem)
*mem = 0


Попробуй, может поможет.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: HTML Парсинг страниц
СообщениеДобавлено: Ср мар 28, 2018 5:51 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 241
Благодарил (а): 33 раз.
Поблагодарили: 24 раз.
Пункты репутации: 0
qpAHToMAS писал(а):
... Если выделяется память, то помимо её FreeMemory(), стоит еще обнулить указатель:

Указатель - просто Integer переменная (синтаксически выделенная, что-бы отличаться внешне),
и от ее значения распределение памяти никак не зависит (фактически можно хранить указатель и в обычной переменной)
Код:
1
2
3
mem.i = AllocateMemory(1024)
Debug MemorySize(mem)
FreeMemory(mem)



зы. напихать в код кучу указателей, а потом долго искать куда течет память, это так по сишному :D
Предлагаю переписать все, минимизировав использование указателей, и все станет гораздо проще...

зызы. там еще и Goto используется (рукалицо)

По делу:
Код:
1
CreateRegularExpression(0, "\>(.*?)<\/textarea>")

зачем это при каждом вызове? (или надо освобождать: FreeRegularExpression(#RegularExpression))
Однократный вызов:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
Static re = 0
Protected str.s = "False"
If Not re
  re = CreateRegularExpression(0, "\>(.*?)<\/textarea>")
EndIf
If ExamineRegularExpression(0, HTML_Parser(u))
  While NextRegularExpressionMatch(0)
    str = RegularExpressionGroup(0, 1)
    Break
  Wend
EndIf
ProcedureReturn str
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: HTML Парсинг страниц
СообщениеДобавлено: Чт мар 29, 2018 5:14 am 
Не в сети
профессор

Зарегистрирован: Чт авг 05, 2010 2:36 pm
Сообщений: 469
Откуда: Донецк
Благодарил (а): 47 раз.
Поблагодарили: 11 раз.
Петр где-то по форуму выкладывал парсер html в пару десяток строк.
Давненько его видел, там 100% помню ни единого указателя. И поиск был по сравнению угловых скобок у тегов.

_________________
PureBasic 5.60 X86, RfoBasic 90, Tinycc 0.97, Asus K54C Intel i7 2.7 ghz, 8 gb ddr3, Intel HD 3000, Windows XP SP3, Windows 10 x64, Nexus 4 and v5.1.1.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: HTML Парсинг страниц
СообщениеДобавлено: Чт мар 29, 2018 8:21 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 673
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
нельзя регулярку использовать для этого дела, регулярка ошибается
есть проблемы при отсутствии одной из скобок, сложность проблеммы зависит от отсутствия открывающей или закрывающей скобки
если скобка будет в подсказке, в тексте, тоже косяк
также регулярка не найдёт самопальные теги, и опять косяк
лет несколько назад по незнанию написал парсер на регулярках, но некоторые косяки так и не разрешились, написано на JS, в принципе прога работает, но только для себя, на люди такое выкладывать......

парсер должен быть посимвольным, тогда этих проблем не будет

Пётр, что искать то? пальцем ткни.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: HTML Парсинг страниц
СообщениеДобавлено: Чт мар 29, 2018 8:29 am 
Не в сети
доцент

Зарегистрирован: Пн мар 05, 2018 4:49 am
Сообщений: 50
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
qpAHToMAS писал(а):
В настройках компиляции поставь ThreadSafe. Если выделяется память, то помимо её FreeMemory(), стоит еще обнулить указатель:
Код:
1
2
FreeMemory(*mem)
*mem = 0


Попробуй, может поможет.

Уже так и сделал, на удивление помогло.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: HTML Парсинг страниц
СообщениеДобавлено: Чт мар 29, 2018 8:34 am 
Не в сети
доцент

Зарегистрирован: Пн мар 05, 2018 4:49 am
Сообщений: 50
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
newJS писал(а):
нельзя регулярку использовать для этого дела, регулярка ошибается
есть проблемы при отсутствии одной из скобок, сложность проблеммы зависит от отсутствия открывающей или закрывающей скобки
если скобка будет в подсказке, в тексте, тоже косяк
также регулярка не найдёт самопальные теги, и опять косяк
лет несколько назад по незнанию написал парсер на регулярках, но некоторые косяки так и не разрешились, написано на JS, в принципе прога работает, но только для себя, на люди такое выкладывать......

парсер должен быть посимвольным, тогда этих проблем не будет

Пётр, что искать то? пальцем ткни.

Я использую функцию из autoit либы.
Код:
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
      Procedure.l StringRegExp3(Array match.s(1), string.s, pattern.s, offset.l = 1)
        FunctionInit()
        Define result.l = 0, re.i = CreateRegularExpression(#PB_Any, pattern)
        IIf(offset > 1, string = Mid(string, offset))
        Repeat
          IIf(re = 0, ErrorBreak(2)) ; Error 2: Bad pattern, array is invalid
          IIf(ExamineRegularExpression(re, string) = 0, ErrorBreak(2))
          IIf(NextRegularExpressionMatch(re) = 0, ErrorBreak(1)) ; Error 1: Array is invalid. No matches
 
          Define index.l = 0, size.l = 10, groups.l = CountRegularExpressionGroups(re)
 
          If groups = 0 ; flag = 3, it will return all full match if there is no group
            count.l = ExtractRegularExpression(re, string, match())
            ReDim match(count)
            ReturnBreak(count)
          EndIf
 
          ReDim match(size)
          Repeat
            For i = 1 To groups
              match(index) = RegularExpressionGroup(re, i)
              index + 1
 
              If size - index < 1
                size * 2
                ReDim match(size)
              EndIf
            Next
          Until NextRegularExpressionMatch(re) = 0
          ReDim match(index)
          result = index
        Until #True
        IIf(re, FreeRegularExpression(re))
        ProcedureReturn result
      EndProcedure



Находит вполне хорошо, жаль не получается сделать паттерн по длине, он обрывается.
например: <textarea name="file" id="file" tabindex="1" \>(.*?)<\/textarea>, такой не прокатит, а хотя должен.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: HTML Парсинг страниц
СообщениеДобавлено: Чт мар 29, 2018 8:36 am 
Не в сети
доцент

Зарегистрирован: Пн мар 05, 2018 4:49 am
Сообщений: 50
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Apokalipsis писал(а):
Петр где-то по форуму выкладывал парсер html в пару десяток строк.
Давненько его видел, там 100% помню ни единого указателя. И поиск был по сравнению угловых скобок у тегов.

Хотелось бы посмотреть.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB