Simple Html Dom – implementace
- Jojo32
- Člen | 8
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
ahoj, nekdo z toho udelal balicek pro composer: https://packagist.org/…l-dom-parser
- Jojo32
- Člen | 8
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
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
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)
- David Matějka
- Moderator | 6445
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
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.
- Jojo32
- Člen | 8
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.
- Jojo32
- Člen | 8
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
- do url není potřeba dávat část za # to stejně server nezpracuje
- 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)
- 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