Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 3. 12. 2020 22:23:39

petusek79
Člen
Registrace: 3. 12. 2020
Příspěvků: 3

Načtení webové stránky z URL do Stringu (v Calcu)

Ahoj!


Mám seznam URL adres webových stránek dvou kategorií. Tyto dva typy jsou odlišitelné podle určité informace umístěné v hlavě (<head>...</head>). Naparsovat hlavu bych asi zvládl, jenže nějak se mi nedaří dohledat, jak mám načíst text té webové stránky obsahující HTML, respektive dosud nalezené návody jaksi selhávají.


Můžete mi někdo, prosím, pomoct?


Zkoušel jsem funkci WEBSERVICE, ale u všech URL mi to vrací jen #VALUE!, takže předpokládám, že budu potřebovat vymyslet nějaké makro.



Pracuji na Windows 10 Home s LibreOffice 7.0.1.2 (x64).



Předem moc děkuji za jakékoliv rady či podněty, případně za odkaz na vlákno, které to řeší, existuje-li takové (předem se omlouvám, pokud dotaz duplikuji, nepodařilo se mi tu nic podobného najít).


P.

Offline

#2 3. 12. 2020 23:56:40

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 697

Re: Načtení webové stránky z URL do Stringu (v Calcu)

webservice by vám měl vrátit kód stránky např.: webservice("https://forum.openoffice.cz/viewtopic.php?id=5880") většinou je to v této podobě nepoužitelné. Použije se to spíše na nějaké webové dotazy jako např. takto: webservice("http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt?date=10.06.2016") vrátí slušně strukturovaný text (nikoli html) s devizovými kurzy z 10.6.2016.


LibreOffice 5.4.

Offline

#3 4. 12. 2020 00:18:11

petusek79
Člen
Registrace: 3. 12. 2020
Příspěvků: 3

Re: Načtení webové stránky z URL do Stringu (v Calcu)

Aha, díky.

Ale co tedy použít? Potřebuji zkrátka načíst z různých URL obsah mezi HTML tagy <head> a </head> do buňky v Calcu nebo do proměnné, abych s tím pak mohl dále pracovat. Když tedy nemůžu použít WEBSERVICE, co s tím? Jak na to?

Offline

#4 4. 12. 2020 05:12:55

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Načtení webové stránky z URL do Stringu (v Calcu)

Logicky to jít nemůže. Přístup na zdroják se musí otevírat příslušným API. Například všechny klasické kancelářské aplikace jsou v XML a musí se udělat určité úpravy externími nástroji.


U HTML a XHTML je to snadnější. Otevřete si zdrojový text vestavěným rozhraním browseru a zkopírujete. Tohle řešení Vás asi nenadchne. Jde to pouze pro několik málo stránek podle toho co vydržíte otevřít.


Jinou cestou je uložit si stránku na disk a otevřít nějakým editorem typu PsPad, NotePad a podobně. Při tomto postupu (tedy uložení na disk) je možné parsovat makry LO, AOO.


Určitě by mělo jít řešení pomocí makra s JavaScriptem, které by stránku dočasně uložilo na disk a po vytěžení smazalo. Existuje i cesta bez ukládání na vlastní disk tak jak si představujete. Podobnou práci dělají "boti" kteří zejména podle hlavičky (ale i podle <body>) řadí nalezené stránky.


Pokusím se vysvětlit problém. Běžně JavaScript (a obecně script) neumí pracovat se soubory. Konkrétně uložit, otevřít, něco přidat.... To málo co lze dělat začíná slovem document.xxxx. Bylo by to velké bezpečnostní riziko a mám dojem, že kvůli tomu je do konce roku vyřazen FlashPlayer.


Když se html otevře v prohlížeči má script přístup k tak zvanému „LocalStorage" které je trvalého charakteru (jde o cookies). Podobně je to s „SessionStorage", které ale zanikne okamžitě po uzavření stránky. Obě „úložiště" patří prohlížeči a je celkem nesnadné se do něj dostat. Je to totiž asociativní pole typu „klíč: hodnota", tedy formátu JSON. Přístup k němu je možný běžným scriptem. (Pozor – jde pouze o otevřené, tedy neuložené html".)
     Domnívám se, že by bylo možné naparsovat hlavičku a uložit do „LocalStorage". LocalStorage má ale maximálně 10 kB takže se musí také čistit…... K takové domněnce mám důvod:


Viděl jsem udělátko, které pomocí dvou stránek ukládá obsah LocalStorage do dokumentu. Bohužel musel bych to asi znovu najít – neukládal jsem si to, ale není to víc jak 4 dny.


Samozřejmě postavit si bota…. To bych měl docela strach, ale také je to možné i když určitě přehnané. Navíc nevím co lze načíst při zákazu botů.


Pokud něco lze vykoumat Basicem, tak jen asi pomocí SimpleFilleAccess. Musí se nastudovat sémantika a testovat. Umí různé věci, ale z voleye nevím co všechno.


V každém případě je asi nejlepší cestou Makro Basic které spustí JavaScript, zpětně načte obsah LocalStorage a uloží do sešitu. Já běžně používám Html + script vygenerovaný Basicem, ale stálo by za to otestovat vestavěná makra JavaScriptu (RHINO).


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#5 4. 12. 2020 07:21:23

petusek79
Člen
Registrace: 3. 12. 2020
Příspěvků: 3

Re: Načtení webové stránky z URL do Stringu (v Calcu)

Předně mnohokrát děkuji za obsáhlou odpověď.


Že to bude takový problém, jsem tedy opravdu netušil.


Naivně jsem si říkal, že když mám pár stovek URL uložených v tabulce, že musí být teoreticky snadné zaitomatizovat proces zjišťování, zda hlavička obsahuje informaci X, nebo Y, aby mi makro v tabulce mohlo k dané URL ve sloupci A zapsat do sloupce B '0', půjde-li o X, a '1', půjde-li o Y.


Vzhledem k vysokému počtu URL, které na to potřebuji otestovat, je jakýkoliv manuální postup u každé jednotlivé URL zcela nereálný.


Mezitím jsem uvažoval o oprášení Javy a stažení Netbeans, teď vidím, že to není zcela od věci, byť se rád učím využívat prostředků nabízených přímo aplikací, s níž pracuji.


Ještě jednou děkuji za odpověď.

Offline

#6 4. 12. 2020 08:11:43

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Načtení webové stránky z URL do Stringu (v Calcu)

Tak jsem chvíli hledal. Článek je zde Blog Michala Altair Valáška


Popisuje celkem dobře princip a uvádí možnost stáhnout "Local Storage Explorer" - je to úplně dole. Bohu žel uvádí ještě "živé explorery local a session", ale ty už nefungují.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#7 4. 12. 2020 11:32:58

kabi
Člen
Registrace: 1. 6. 2017
Příspěvků: 167

Re: Načtení webové stránky z URL do Stringu (v Calcu)

Jak psal ludviktrnka, vzorec např. webservice("https://www.seznam.cz") vrátí kod stránky a dále si můžete vzorci nebo makrem ten vrácený text prohledat a vytáhnout potřebnou informaci. Jestli vám vzorec vrací chybu, máte ho asi špatně zapsaný nebo složený. Dejte sem kdyžtak příklad jedné adresy.

Offline

#8 4. 12. 2020 12:17:13

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 368

Re: Načtení webové stránky z URL do Stringu (v Calcu)

Pomocí SimpleFileAccess si můžete načíst html data která vrací url adresa.

Takhle je to řádek po řádku až do načtení </head>, čili ušetříte datový přenos neb vám server nebude muset vracet celou html stránku.

Function nactiZurlPoRadku 'načte html hlavičku z dané url - zde do tagu </head>
	dim sUrl$, sEnter$, s$, oSimpleFileAccess as object, oInputStream as object, oTextStream as object, s1$
	rem určit druh enteru pro daný systém
	if getGuiType()=3 then 'mac
		sEnter=chr(13)
	elseif getGuiType()=4 then 'linux
		sEnter=chr(10)
	else 'win
		sEnter=chr(13) & chr(10)
	end if
	sURL=ConvertToUrl("http://nejakaTaUrl") 'vaše Url
	oSimpleFileAccess=createUnoService( "com.sun.star.ucb.SimpleFileAccess" )
	oInputStream=oSimpleFileAccess.openFileRead(sURL)
	oTextStream=createUnoService("com.sun.star.io.TextInputStream")
	oTextStream.InputStream=oInputStream
	oTextStream.Encoding="UTF-8"
	Do While NOT oTextStream.isEOF
	   s1=oTextStream.readLine() 'načtený řádek
	   s=s & sEnter & s1 'všechny načtené řádky odenterovat a dát do jednoho řetězce
	   if InStr(s1,"</head>")>0 then exit do 'obsahuje-li načtený řádek značku pro ukončení tak konec
	Loop
	oInputStream.closeInput()
	msgbox s
End Function

Následující kód vám vypíše kód celé html stránky z dané url.

Function loadFileString(optional sEncoding$) as string 'load file to the string
	if IsMissing(sEncoding) then sEncoding="UTF-8" 'když není zadáno kódování tak předpokládat utf-8
	dim sUrl$, s$, oSfa as object, oTextStream as object, oStream as object, sFileName$
	sFileName="http://taVaseAdresa.neco"
	sUrl=ConvertToURL(sFileName)
	oSfa=CreateUNOService("com.sun.star.ucb.SimpleFileAccess")
	if oSfa.exists(sUrl) then
		oStream=oSfa.openFileRead(sUrl)
		oTextStream=CreateUNOService("com.sun.star.io.TextInputStream")
		oTextStream.InputStream=oStream
		if (Trim(sEncoding)<>"") then
			oTextStream.Encoding=sEncoding
		end if
		s=oTextStream.readString(array(), false)
		oTextStream.closeInput
		oStream.closeInput
	else
		msgbox(sFileName & chr(13) & "soubor neexistuje",16)
		stop
	end if
	msgbox s
End Function

Dejte však pozor abyste s tím nedělal či to netestoval nějak masivně, aby vás některý server nepovažoval za DDos nezbedníka :-)!

Editoval kamlan (4. 12. 2020 22:23:24)

Offline

Zápatí