Simple Html Dom – implementace

Jojo32
Člen | 8
+
0
-

Ahoj. Mám takovou otázku, která se netýká přímo jen Nette.

Nemá někdo zkušenosti s implementací s Simple Html Dom parseru do Nette?
Zkoušel jsem to zaregistrovat jak službu, ale problém je, že ten soubor má nějaké funkce i mimo třídu a hlásí to nějaké kolize s proměnnýma, který jsou v těch funkcích.

A pak jsem to zkoušel přes include přímo do Presenteru, ale tam to hlásí „A non-numeric value encountered“, což mě nenapadá proč.

Nemá s tím někdo zkušenosti? Případně existuje v rámci nette nějaký postup, jak takovéto soubory implementovat?

Děkuji za každou radu!

David Matějka
Moderator | 6445
+
+1
-

ahoj, nekdo z toho udelal balicek pro composer: https://packagist.org/…l-dom-parser

Jojo32
Člen | 8
+
0
-

Super!
Díky moc :) To je lehčí než jsem čekal

Jojo32
Člen | 8
+
0
-

Ještě jestli můžu dotaz k tomuto.
Potřeboval bych prohledávat stránku pomocí regulárních výrazů, což samotný simple_html_dom neumí, jak sem někde četl.
Tak to kombinuji s CURL. Zkoušel jsem to různými způsoby, ale vždy jsem narazil. Hlavní problém je jak se dostat k funkci load() ze simple_html_dom, pro další práci se stránkou již pomocí funkcí v simple_html_dom. „nejblíž“ jsem se k ní dostal tímhle, ale v tomto případě když se snažím vytvořit instanci třídy to hlasí, že třídu simple_html_dom() nemůže najít :

$url = "!https:\/\/www\.vutbr\.cz\/lide\/(.+?)-(.+?)-106440\/publikace#navigace-vizitka!";
		$curl = curl_init($url);
		curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
		$curl_scraped= curl_exec($curl);

		$html = new simple_html_dom();
		$page=$html->load($curl_scraped);

Nemáte s tímto někdo zkušenosti, případně nevíte jak to vyřešit? Load() funkce je umístěna v simple_html_dom.php → class simple_html_dom

Kcko
Člen | 468
+
0
-

Hledá to asi v nějakém NS, uveď před simple_html_dom() zpětné lomítko.
A jinak logicky SimpleHtmlDom neumí hledat přes reguláry, proto se jmenuje tak jak se jmenuje.
Ale s nejvetší pravděpodobností bude umět najít co potřebuješ, akorát to neumíš.

Editoval Kcko (10. 3. 2018 15:10)

Jojo32
Člen | 8
+
0
-

Tak jsem zkoušel různý možnosti, včetně lomítka, ale bohužel bez úspěchu. Zkoušel jsem tu load() funkci přímo vložit do HtmlDomParser.php, kterej se tvoří v rámci balíčku, ale taky bez úspěchu…

Potřebuji s tím prohledávat url, kde se mění 3 parametry, ale já chci kontrolovat změnu jen jednoho z nich.
Konkrétně to je „/‚jmeno‘-‚prijmeni‘-‚id‘/“. Jméno a příjmení bych řešit nechtěl, jen bych chtěl sledovat ID, který bych do URL vkládat z databáze…

To SimpleHtmlDom umí vyřešit?

Napadá mě jen, že tam budu vkládat jméno a příjmení taky z databáze, ale to zase zvětšuje šanci na chybu.
Omlouvám se, že se ptám na věci co úplně nesouvisí s nette, ale celkem v tom plavu, tak budu vděčný za každou zkušenost.

Editoval Jojo32 (11. 3. 2018 11:13)

Kcko
Člen | 468
+
0
-

Ukaž co chceš kde zpracovávat? (Odkaz a přesný popis).

David Matějka
Moderator | 6445
+
0
-

1. koukni se do readme toho balicku. mas pouzit:

use Sunra\PhpSimple\HtmlDomParser;

...
$dom = HtmlDomParser::str_get_html( $str );

2.
ten kod

$url = "!https:\/\/www\.vutbr\.cz\/lide\/(.+?)-(.+?)-106440\/publikace#navigace-vizitka!";
        $curl = curl_init($url);

vubec nedava smysl. ceho chces dosahnout?

Jojo32
Člen | 8
+
0
-

Kcko napsal(a):

Ukaž co chceš kde zpracovávat? (Odkaz a přesný popis).

Třeba ze stránky https://www.vutbr.cz/…15/publikace#… , chci zpracovat všechny ty publikace včetně odkazů a věcí v těch odkazech. To sem udělal pomocí SimpleHtmlDom, ale až pozdě jsem začal řešit ten problém, že takových odkazů bude víc. A já bych ty odkazy chtěl hledat pomocí toho třetího parametru lidí(který budu tahat z databáze), což je ID a ty jména ideálně „neřešit“.

David Matějka napsal(a):

ten kod
vubec nedava smysl. ceho chces dosahnout?

No, ta URL by měla být simulovat univerzální URL pro všechny s tím, že to id jsem tam zatím jako proměnnou nedával, když nefunguje ani tohle. A to další by měl být postup cURL, abych dostal string nebo url, ze které bych mohl už dostat DOM a s tím pak dál pracovat.

CZechBoY
Člen | 3608
+
0
-

Ty si tu url vykopíroval z nějakýho preg_match a teď si ten pattern dal do url, to opravdu nedává smysl.

Jojo32
Člen | 8
+
0
-

CZechBoY napsal(a):

Ty si tu url vykopíroval z nějakýho preg_match a teď si ten pattern dal do url, to opravdu nedává smysl

No… Popravdě jsem tento postup provedl na popud nějakých řešení co jsem našel na netu. Bohužel moc se v tom nevyznám, ale jim to takhle fungovalo, tak jsem si říkal „Proč by to nemohlo fungovat i mně“.
Jak by jsi tuto situaci případně řešil ty prosím? Jestli jsi se s ní tedy někdy setkal.

CZechBoY
Člen | 3608
+
0
-

Sestavil bych si normální url a ne pattern regexu :-)

Jojo32
Člen | 8
+
0
-

CZechBoY napsal(a):

Sestavil bych si normální url a ne pattern regexu :-)

Nevím jestli úplně chápu co myslíš, ale normální url jsem měl, nebo tedy „mám“

$page = HtmlDomParser::file_get_html("https://www.vutbr.cz/lide/jiri-sremr-17715/publikace#navigace-vizitka");

ze které tahám. Ale tam těch lidí bude víc, teda bude i víc url a jak to udělat, aby to bylo co nejuniverzálnější? Ideálně aby to hledalo automaticky podle databáze zaregistrovaných uživatelů?

dms
Člen | 94
+
0
-
  1. do url není potřeba dávat část za # to stejně server nezpracuje
  2. nejdřív musíš někde získat seznam všech url. Pokud máš databázi tak není nic jednoduššího než vytáhnout z db a data foreachem procházet po jednom řádku a html získávat po jednom requstu na každý řádek. (jesli přes CURL nebo file_get_contents je jedno, cílem je získat obsah z jednoznačně dané url)
  3. já používám na crawling https://symfony.com/…crawler.html ale pokud ti simple dom stačí a máš to již hotové tak bych nepředělával