rysson / kodi-misc

Kodi misc
0 stars 0 forks source link

Dopieścić parseDOM() #1

Open rysson opened 6 years ago

rysson commented 6 years ago

Funkcja parseDOM() jest namiastką parsera HTML. Jest to alternatywa dla:

parseDOM() jest o tyle istotna, że na niej opera się parsowanie niemal każdej strony.

Funkcję znalazłem w MrKnow. W Cherry (w PWT) jest funkcja zdecydowanie nowsza, lepiej znajdująca elementy, niemniej znacząco wolniejsza. Zacząłem przerabiać ją aby dało się obłożyć czymś w rodzaju selektora CSS. Mój kod opera się na MrKnow bo parę dni temu jeszcze nie wiedziałem, że jest inna implementacja w PWT. Obecnie łączę cechu obu realizacji, czyli moja wersja niemal tak wolna ja ta z PWT i niemal tak dziurawa jak ta z MrKnow :-D

Głęboki refactoring prowadzę równolegle do innych prac dla Cherry API ma być niezmienne z dokładnością do poprawek błędów i dodatkowych funkcji.


¹) Jest nadzieja dla binarnych paczek choć ciągle jest to za dużo zachodu:

rysson commented 6 years ago

Testy wydajnościowe na obecną chwilę dla dość wrednego (1200 dużo krótkich tagów) pliku 800kB. Czas w sekundach.

Python2

Test mrknow cherry rysson
tags 2.207 5.138 4.949
attrs 1.638 1.755 1.603

Python3

Test mrknow cherry rysson
tags 0.381 1.029 0.837
attrs 0.288 0.386 0.290

Aż szkoda, że Kodi nie obsługuje Pythona 3 :-)

rysson commented 6 years ago

Przykładowe błędy.

Poprawny wynik jest pogrubiony

parseDOM(...) mrknow cherry rysson
('<a>A</a><a x="1">B</a>', 'a') ['A'] ['A', 'B'] ['A', 'B']
('<a z=">">A</a>', 'a') ['">A'] ['">A'] ['A']
('<a>A<a>B</a></a>', 'a') ['A<a>B</a>', ''] ['A<a>B</a>', 'B'] ['A<a>B</a>', '']
rysson commented 6 years ago

Status

Funkcja po poprawkach. Wygląda, że nie tylko bardziej poprawnie znajduje tagi, ale i szybciej działa.

Testy

parseDOM('...', 'a') mrknow cherry rysson
<a>A</a>Q ['A'] ['A'] ['A']
<a>A<a>B</a>C</a>Q ['A<a>B</a>C', ''] ['A<a>B</a>C', 'B'] ['A<a>B</a>C', 'B']
<a>A<a/>B</a>Q ['A<a/>B'] ['A<a/>B', ''] ['A<a/>B', '']
<a>A<x>B<a>C</x>D</a>Q</a>R ['A<x>B<a>C</x>D</a>Q', ''] ['A<x>B<a>C</x>D</a>Q', 'C</x>D'] ['A<x>B<a>C</x>D', 'C']
<a>A</a><a x="1">B</a>Q ['A'] ['A', 'B'] ['A', 'B']
<a z=">">A</a>Q ['">A'] ['">A'] ['A']

Czas wykonania

Czas w sekundach.

Python2

Test mrknow cherry rysson
tags 2.148 5.220 0.297
attrs 1.602 1.733 0.122

Python3

Test mrknow cherry rysson
tags 0.379 1.038 0.238
attrs 0.284 0.381 0.087
rysson commented 6 years ago

Zmian dużo, (patrz dokumentacja), czas wykonania nam podupadł i trzeba było się zabrać za wydajność.

Po poprawkach (czas w sekundach). Ciekawe jest zrównanie się czasów Pythona 2 i 3.

Python2

Test mrknow cherry rysson rysson.Node
tags 2.209 5.165 0.202 0.071
attrs 1.626 1.759 0.085

Python3

Test mrknow cherry rysson rysson.Node
tags 0.393 1.121 0.202 0.072
attrs 0.299 0.393 0.085

rysson.Node to pobieranie samych węzłów Node(), w których zarówno atrybuty jak i zawartość jest parsowana na żądanie. Pomiar pokazuje czas samego szukania, bez parsowania. Stąd ten czas jeszcze krótszy niż dla attrs (który notabene korzysta wewnętrznie z Node).