Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Parser HTML, Prosty, acz zasobożerny parser HTML
b4rt3kk
post 4.10.2013, 13:24:43
Post #1





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Witam,
przedstawiam do oceny parser HTML mojego autorstwa.

Plik do pobrania:
http://www.filedropper.com/htmlparserclassphp

Opis:
Zasada działania jest prosta, wystarczy zaincludować plik z klasą, która znajduje się w powyższym pliku. Następnie utworzyć nowy obiekt, np.
  1. $parser = new HTMLparser();

Dostępne są 3 metody pobierania HTML, który będziemy parsować:
- z pliku
  1. $parser->parseFile($dir);

- ze stringa
  1. $parser->parseString($string);

- z URL
  1. $parser->parseUrl($url);


Następnie wywołanie parsera:
  1. $resource = $parser->find('div');


Jako wynik zmienna $resource będzie przechowywać tablicę obiektów DIV-ów znalezionych w parsowanym źródle, bądź jeden obiekt, jeśli w metodzie find jako drugi argument podamy liczbę (wtedy zwróci n-ty DIV z parsowanego źródła).

Odczyt informacji:
Odczyt jest bardzo prosty, każdy wynik zawiera obiekty text oraz html, ponadto jeśli DIV posiada atrybuty, np. class bądź id zostaną one zwrócone również w postaci obiektów. Przykład:

  1. foreach ($resource as $div) {
  2. echo $div->text;
  3. echo $div->html;
  4. echo $div->class;
  5. // itd.
  6. }


To tak po krótce tytułem wstępu. Jednak parser wymaga optymalizacji, ponieważ czas parsowania średniej wielkości źródła jest dosyć długi. Proszę o oceny, a także o wskazanie dalszej drogi rozwoju owego parsera (zastanawiałem się jeszcze nad wyszukiwaniem elementów HTML np. po class, bądź po ID, jednak w tym momencie nie mam jeszcze pomysłu jak to zrealizować, bo już teraz parser w obecnej formie jest dość "ciężki"). Pozdrawiam i dzięki za ewentualne sugestie.

EDIT:
Zapomniałem dodać, możemy również szukać dzieci naszych wynikowych obiektów, np.
  1. foreach ($resource as $div) {
  2. echo $div->find('a', 0)->href;
  3. }


Możliwość zagnieżdżania jest nieograniczona.

Ten post edytował b4rt3kk 4.10.2013, 13:31:07


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
sowiq
post 4.10.2013, 13:33:50
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Ja mam tylko jedno pytanie. Czemu miałbym używać Twojej, jak to sam określiłeś - zasobożernego parsera (zresztą nie dziwię się skoro najróżniejszych preg'ów w kodzie jak mrówek), zamiast powszechnie używanej i dużo bardziej rozbudowanej klasy DOMDocument?

Ten post edytował sowiq 4.10.2013, 13:35:09
Go to the top of the page
+Quote Post
b4rt3kk
post 4.10.2013, 14:16:43
Post #3





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Cytat(sowiq @ 4.10.2013, 14:33:50 ) *
Ja mam tylko jedno pytanie. Czemu miałbym używać Twojej, jak to sam określiłeś - zasobożernego parsera (zresztą nie dziwię się skoro najróżniejszych preg'ów w kodzie jak mrówek), zamiast powszechnie używanej i dużo bardziej rozbudowanej klasy DOMDocument?


Tzn. jest to dopiero wczesna wersja, nie zachęcam nikogo do użytkowania, a proszę jedynie o wykazanie błędów, ew. drogi rozbudowy / rozwoju. Sam parser powstał na mój własny użytek, nie mam zamiaru go nigdzie udostępniać (póki co), jakkolwiek jeśli ktoś jednak zechce skorzystać, to proszę bardzo, nie mam nic przeciwko. Ani nie pobieram opłat, ani nie zbieram dotacji, także wolny wybór użytkownika. A temat się tyczy jedynie oceny.


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
mstraczkowski
post 4.10.2013, 15:40:24
Post #4





Grupa: Zarejestrowani
Postów: 273
Pomógł: 52
Dołączył: 3.02.2013
Skąd: Przemyśl

Ostrzeżenie: (0%)
-----


Na pierwszy rzut oka:

1. Brak modyfikatorów dostępu przy metodach
2. Dwie klasy w jednym pliku (tak nie powinno się pisać)
3. Mało komentarzy w kodzie oraz mało poprawne tagi phpdoc (@param, a nie @params)
4. Projektując klasę nie powinno się już raczej używać kończącego tagu php ?>
5. Słaba estetyka kodu

Ten post edytował mstraczkowski 4.10.2013, 15:41:02


--------------------
Jeżeli moja wypowiedź Ci pomogła użyj przycisku
Go to the top of the page
+Quote Post
pyro
post 4.10.2013, 18:33:11
Post #5





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


Wrzuciłbyś jako repozytorium.

// ADD

Cytat(mstraczkowski @ 4.10.2013, 16:40:24 ) *
4. Projektując klasę nie powinno się już raczej używać kończącego tagu php ?>


Jak ktoś widzi co robi to nie ma grzechu. Jak się da to czemu nie, ale nie jest to jakaś wada, którą można wytknąć jako błąd. To tak samo powinno się wymyśleć jak uniknąć white-space na początku. Bardziej już należy uważać, żeby przypadkiem nie zapisać pliku jako UTF-8 z BOM. Przezorność trochę na wyrost ;p

Ten post edytował pyro 4.10.2013, 18:26:45


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
mstraczkowski
post 4.10.2013, 19:59:35
Post #6





Grupa: Zarejestrowani
Postów: 273
Pomógł: 52
Dołączył: 3.02.2013
Skąd: Przemyśl

Ostrzeżenie: (0%)
-----


Jak najbardziej, jest to po prostu dobra praktyka.


--------------------
Jeżeli moja wypowiedź Ci pomogła użyj przycisku
Go to the top of the page
+Quote Post
IceManSpy
post 4.10.2013, 22:12:36
Post #7





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Nie przeglądałem zawartości tego pliku, ale bardzo podobna klasa jest tutaj (bardzo podobnie wywoływane są parametry w funkcjach):
http://simplehtmldom.sourceforge.net/


--------------------
Go to the top of the page
+Quote Post
b4rt3kk
post 5.10.2013, 02:28:37
Post #8





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Cytat(mstraczkowski @ 4.10.2013, 16:40:24 ) *
Na pierwszy rzut oka:

1. Brak modyfikatorów dostępu przy metodach
2. Dwie klasy w jednym pliku (tak nie powinno się pisać)
3. Mało komentarzy w kodzie oraz mało poprawne tagi phpdoc (@param, a nie @params)
4. Projektując klasę nie powinno się już raczej używać kończącego tagu php ?>
5. Słaba estetyka kodu


Kolego, przepraszam bardzo, ale jak to się ma do zasadności mojego pytania, czyli optymalizacji? To że poprawie komentarz z params na param nie wpłynie w żaden sposób na wydajność klasy. W wersji skompresowanej nawet nie będzie tych komentarzy. Nie oceniasz mojego zeszytu do polskiego, żeby patrzeć na estetykę, czy przypisy na marginesie... Czy mogę liczyć na jakieś sensowne porady? Preg_match nie jest tam znów tak wiele, ale byłbym wdzięczny jakby mi ktoś wskazał choć jeden który mogę zastąpić inną, szybszą funkcją. Lub wykazał błędność mojego toku rozumowania. Ogólnie rzecz biorąc, nie chodzi o estetykę, a o użyteczność.


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
mstraczkowski
post 5.10.2013, 08:37:33
Post #9





Grupa: Zarejestrowani
Postów: 273
Pomógł: 52
Dołączył: 3.02.2013
Skąd: Przemyśl

Ostrzeżenie: (0%)
-----


Jeżeli tak podchodzisz do tematu to nie mam Ci nic więcej do powiedzenia.
Umieszczasz temat w dziale "Oceny", na początku piszesz:

Cytat
przedstawiam do oceny parser HTML mojego autorstwa.


Później piszesz:
Cytat
Proszę o oceny, a także o wskazanie dalszej drogi rozwoju owego parsera
...
Pozdrawiam i dzięki za ewentualne sugestie.

Wskazanie ci problemów wydajnościowych miało być dodatkiem do tematu, a nie jego głównym celem.
Głównym celem była ocena, którą na pierwszy rzut oka podesłałem.

Kod ocenia się nie tylko patrząc na jego użyteczność, chociaż podobnie jak sowiq nie widzę dla tej klasy sensu bytu.

Niestety, ale przejawiasz problem większości programistów PHP, którzy mają głęboko w poważaniu swój kod, jego estetykę i poprawność wg. standardów, a potem w przyszłości ktoś musi takie "wymiociny" przeglądać i edytować, bo komuś nie chciało się zadbać o kod i tłumaczył się tym, że użyteczność jest ważniejsza niż estetyka kodu.

Najlepiej zakoduj swoją klasę w IonCube, albo napisz wszystko w jednej linii i daj nam ponownie do oceny.
Bo przecież chodzi o użyteczność, a nie estetykę i wygląd kodu.

A błąd w twoim toku rozumowania powstał już na etapie kiedy zrodził się pomysł stworzenia tej klasy zamiast wykorzystać DOMDocument

Ten post edytował mstraczkowski 5.10.2013, 09:03:45


--------------------
Jeżeli moja wypowiedź Ci pomogła użyj przycisku
Go to the top of the page
+Quote Post
b4rt3kk
post 5.10.2013, 09:11:59
Post #10





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Cytat(mstraczkowski @ 5.10.2013, 09:37:33 ) *
Jeżeli tak podchodzisz do tematu to nie mam Ci nic więcej do powiedzenia.
Umieszczasz temat w dziale "Oceny", na początku piszesz:



Później piszesz:

Wskazanie ci problemów wydajnościowych miało być dodatkiem do tematu, a nie jego głównym celem.
Głównym celem była ocena, którą na pierwszy rzut oka podesłałem.

Kod ocenia się nie tylko patrząc na jego użyteczność, chociaż podobnie jak sowiq nie widzę dla tej klasy sensu bytu.

Niestety, ale przejawiasz problem większości programistów PHP, którzy mają głęboko w poważaniu swój kod, jego estetykę i poprawność wg. standardów, a potem w przyszłości ktoś musi takie "wymiociny" przeglądać i edytować, bo komuś nie chciało się zadbać o kod i tłumaczył się tym, że użyteczność jest ważniejsza niż estetyka kodu.

Najlepiej zakoduj swoją klasę w IonCube, albo napisz wszystko w jednej linii i daj nam ponownie do oceny.
Bo przecież chodzi o użyteczność, a nie estetykę i wygląd kodu.

A błąd w twoim toku rozumowania powstał już na etapie kiedy zrodził się pomysł stworzenia tej klasy zamiast wykorzystać DOMDocument


No nic, dzięki kolego. Widzę, że bezzasadny jest dalszy rozwój projektu. Niby działa jak należy, ale za wolno, a ja nie widzę sposobu na redukcję.

Tylko czemu kod jest nieestetyczny? Hmm?


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
pyro
post 5.10.2013, 09:16:32
Post #11





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


@b4rt3kk, podstawą użyteczności jest poprawnie napisany kod, a co za tym idzie np. wskazane przez @mstraczkowski błędy w komentarzach. Bo użyteczność jako pojęcie obejmuje także to w jak przystępny sposób inni będą mogli używać takiego kodu.

Osobiście również nie widzę sensu w istnieniu tego kodu z powodów wyżej wymienionych, ale jeżeli jest to dla nauki lub treningu, to jak najbardziej. Tylko wtedy nie należy piszczeć jak mała dziewczynka, bo się robi błędy wink.gif


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
!*!
post 5.10.2013, 09:49:27
Post #12





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Cytat(b4rt3kk @ 4.10.2013, 14:24:43 ) *


Wrzuć to na github/gist w wersji online.


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 31.07.2025 - 09:54