abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 12:00 | Zajímavý projekt

Projekt Termbox umožňuje vyzkoušet si linuxové distribuce Ubuntu, Debian, Fedora, CentOS a Arch Linux ve webovém prohlížeči. Řešení je postaveno na projektu HyperContainer. Podrobnosti v často kladených dotazech (FAQ). Zdrojové kódy jsou k dispozici na GitHubu [reddit].

Ladislav Hagara | Komentářů: 8
dnes 11:00 | Bezpečnostní upozornění

Byly zveřejněny informace o bezpečnostní chybě CVE-2016-8655 v Linuxu zneužitelné k lokální eskalaci práv. Chyba se dostala do linuxového jádra v srpnu 2011. V upstreamu byla opravena minulý týden [Hacker News].

Ladislav Hagara | Komentářů: 0
včera 22:00 | Komunita

Přibližně před měsícem bylo oznámeno, že linuxová distribuce SUSE Linux Enterprise Server (SLES) běží nově také Raspberry Pi 3 (dokumentace). Obraz verze 12 SP2 pro Raspberry Pi 3 je ke stažení zdarma. Pro registrované jsou po dobu jednoho roku zdarma také aktualizace. Dnes bylo oznámeno, že pro Raspberry Pi 3 je k dispozici také nové openSUSE Leap 42.2 (zprávička). K dispozici je hned několik obrazů.

Ladislav Hagara | Komentářů: 5
včera 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 46
včera 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 10
3.12. 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 17
3.12. 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 25
2.12. 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 18
2.12. 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 7
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 775 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: Jak vypreparovat data z HTML tabulky do CSV?

1.11.2007 22:07 David Jaša | skóre: 44 | blog: Dejvův blog
Jak vypreparovat data z HTML tabulky do CSV?
Přečteno: 1337×
Stojím teď před problémem: potřebuju z HTML stránky dostat některá data. HTML je celé na jednom řádku a podstatná část z DOM stromu vypadá zhruba takto:
tr
-td
-td
-td
tr
-td
-td
-td
--input
--@onclick
Přičemž těch řádků je hodně a některé (jako ten první) nenesou žádnou informaci. Ty podstatné řádky mají v poslední buňce input a potřeboval bych znát hodnotu textu v prvních dvou buňkách a parametr onclick elementu input v poslední buňce. Jak na to jít? Napadly mě dvě cesty jak toho dosáhnout:

- sed: vymyslet regulární výraz, který z HTML vytáhne zajímavé HTML řádky (každý na jeden plaintext řádek) a pak pomocí prostého s/regexp/\1;\2;\3/ z těchto řádků vytáhnout řetězce a poskládat je. Vůbec ale netuším, vytáhnout ty podstatné HTML řádky

- xsltproc --html: Zkusil jsem si vytvořit xsl styl, který tyto informace vytáhne. Nedaří se mi ale vytvořit šablonu tak, abych dostal obsah pouze ze mnou žádaných uzlů, buď se nevypíše nic nebo se vypíše obsah všech textových uzlů.

Díky za jakoukoliv pomoc.

Odpovědi

Josef Kufner avatar 1.11.2007 22:15 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Pokud máš řádek v tabulce umístěný na jendom řádku v souboru, tak by nemělo být problém nahradit </td><td> za čárky a máš víceméně hotovo.

Další možností by mohlo být použít lynx nebo links, nechat si to vyrenderovat do plain textu a z něj to nějak vyříznout. Hodně ale záleží na povaze dat.

Případně můžeš zkusit ctrl+c, ctrl+v z mozilly do oo calcu ;-)
Hello world ! Segmentation fault (core dumped)
1.11.2007 22:53 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Problém je, že na jednom řádku je celá tabulka zapouzdřená ještě v tabulce, co tvoří layout. Jakmile z toho dostanu jeden HTML řádek na jeden plaintext řádek, tak jsem za vodou. Links, lynx, mozilla ani jiný běžný browser pak neřeší úkol vydolovat hodnotu parametru onclick elementu input... Vlastní data jsou všechno alfanumerické znaky (i s diakritikou nejspíš ve windows 1250).
1.11.2007 23:04 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Jakmile z toho dostanu jeden HTML řádek na jeden plaintext řádek, tak jsem za vodou

A co třeba:

sed 's#</tr>#</tr>\n#' | sed -n '/<tr>/p' | \
  sed 's#<tr><td>\([^<]*\)</td>...<input onclick="\([^"]*\)">...#\1 ..#'
I am always ready to learn although I do not always like to be taught. (W. Churchill)
1.11.2007 23:12 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Tento sed nezvládá vloženou tabulku - začne otevírací značkou <tr> tabulky, co dělá layout, skončí na uzavírací značce prvního řádku vnitřní tabulky a další řádky už nevypíše...
1.11.2007 23:33 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?

's#</tr>#</tr>\n#' => 's#</tr>#</tr>\n#g'

PS: je to jenom nástřel, možná je to úplně špatně (a nakonec bude to XSLT nejlepším řešením)

I am always ready to learn although I do not always like to be taught. (W. Churchill)
1.11.2007 23:40 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Stále nic. Ráno sem postnu svou snahu o XSLT. :-)
1.11.2007 23:48 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
XSLT je asi ideální nástroj, ale jen za předpokladu, že je to HTML napsané tak slušně, aby ho bylo možné (možná po malé úpravě) považovat za XML.
2.11.2007 09:54 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
xsltproc(1):

--html The input document is an HTML file.
2.11.2007 21:55 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
To nemusí stačit. Nemalá část toho, co servery prohlašují za text/html, ve skutečnosti není HTML.
zoul avatar 2.11.2007 07:38 zoul | skóre: 43 | blog: | Boskovice
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
XSLT by (alespoň na mě osobně) bylo overkill, regulární výraz v Perlu to spolehlivě vyřeší. Nechceš sem místo XSLT řešení poslat ukázkovou tabulku a výstup, který bys z ní chtěl dostat? Jinak budeme do haleluja upřesňovat zadání.
1.11.2007 22:35 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?

Ještě je tady alternativa někde na pomezí - pokud umíte v AWK, tak bude možná nejrychlejší použít xgawk, což AWK upravený pro zpracování XML (místo řádkových vzorů se používá vzor pro počáteční elementy atp.) - více v dokumentaci.

I am always ready to learn although I do not always like to be taught. (W. Churchill)
1.11.2007 22:54 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
V awk neumím, k podobným hrátkám v shellu se dostanu tak jednou za rok...
2.11.2007 08:34 Aleš Kapica | skóre: 45 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Přesně tak, awk není zase tak složitý a je to mocný nástroj. Ve spojení s nějakou řádkovou utilitou co zobrazí to html jako plain text z toho v pohodě data kuchnete.

Ovšem návrh co se objevil hned v počátku - zkopírovat data do tabulky v OpenOffice také není úplně špatný, hodněkrát jsem si tak pomohl. A řešení s XSLT? Výborné, ovšem také má své ale.
2.11.2007 09:50 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Jasně, ale jak při převedení na plaintext libovolným browserem získám ta data z parametru INPUTu? Jakmile to budu mít v plaintextu, tak to zvládnu sedem, jak už jsem psal...
2.11.2007 10:29 Aleš Kapica | skóre: 45 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Musel bych to vidět..
2.11.2007 10:51 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Jak zhruba vypadá to html (špičaté závorky pro rychlost nahrazeny hranatými):
[html]
[head]
  [title]titulek[/title]
  [script language="javascript"]
    skript, ktery obsahuje ruzne [elementy /] a mate tim xsltproc
  [/script]
[head]
[body]
[table] [!-- layout --]
[tbody]
[tr]
[td]
[div]
[table]
[script language="javascript"]dalsi skript[/script]
[tbody]
[tr]
  [td]nadpis sloupce 1[/td]
  [td]nadpis sloupce 2[/td]
  [td]nadpis sloupce 3[/td]
  [td]nadpis sloupce 4[/td]
  [td][/td]
[/tr]
[tr]
  [td]text11[/td]
  [td]text12[/td]
  [td]text13[/td]
  [td]text14[/td]
  [td][input onclick="akce1"][/td]
[/tr]
[tr]
  [td]text21[/td]
  [td]text22[/td]
  [td]text23[/td]
  [td]text24[/td]
  [td][input onclick="akce2"][/td]
[/tr][/tbody][/table][/div][/td][/tr][/tbody][/table][/body]
přičemž celé <body> je na jednom řádku a potřebuji z toho dostat takovéto .csv:
text11;text12;akce1
text21;text22;akce2
2.11.2007 11:08 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?

Nejdřív bych naházel každý tag na jeden řádek (teda ukončit řádku za uzavíracím):

sed 's#</[^>]*>#&\n#g'

Tohle by mohlo dát všechny [tr] do jednoho řádku a vytisknout je:

sed -n '/<tr>/{:a;s#</tr>#&#;t k;N;s#\n##;b a;:k;p}'

Možná to nebude fungovat úplně přesně, ale myšlenka (použít N a podmíněný skok t) je snad správná.

Pak by mělo stačit prohnat to grepem a sedem přetransformovat...

I am always ready to learn although I do not always like to be taught. (W. Churchill)
2.11.2007 11:30 Aleš Kapica | skóre: 45 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Je to jen naznačení postupu..
user@stroj:~$ w3m tabulky.htm | awk '{...}'
Taky mi z toho není jasné, jestli se v tom inputu objevují nějaké hodnoty generované javascriptem atp. To s ukázkou kódu nasimuluji stěží..
Josef Kufner avatar 2.11.2007 23:31 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Na tohle se hodí awk. Vždy pri [/tr] vypíšeš nakešované řádky od minulého [tr] na jeden řádek. Tím sladíš logické a fyzické řádky. Nakonec bych to předhodil sedu, ať vyhází zbytečnosti... něco jako:
awk '
   $0 ~ "[tr]" { ln = 0; }
   $0 ~ "[td]" { line[ln++] = $0; }
   $0 ~ "[/tr]" { print line[0] line[1] line[2] line[3] line[4]; }
' < file.html | sed 's/.../\1 \2 \3 \4 \5/'
Ten sed už zvládneš určitě sám... ;-)
Hello world ! Segmentation fault (core dumped)
3.11.2007 14:08 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Celé <body> je na jednom fyzickém řádku...
zoul avatar 3.11.2007 11:35 zoul | skóre: 43 | blog: | Boskovice
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Tak nabízím tohle:
#!/usr/bin/env perl

use strict;
use warnings;
undef $/;
$_ = <>;

my @ctx = m{
	<tr>\s*					# Úvodní TR
	<td>([^<]*)</td>\s*			# První buňka
	<td>([^<]*)</td>\s*			# Druhá buňka
	(?:<td>[^<]*</td>\s*)*			# Zbývající buňky
	<td><input\s*onclick="(.*?)">		# INPUT, od kterého se odpíchneme
	(?{print "$1;$2;$3\n"})			# Vypsat výstup
}gsx;
Na zadané ukázce frčí dobře:
zoul@naima:~$ ./tabulky.pl < vstup.html 
text11;text12;akce1
text21;text22;akce2
zoul@naima:~$ 
3.11.2007 11:48 moira | skóre: 30 | blog: nesmysly
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Predbehl jsi me :) Perl je proste na nektere veci k nezaplaceni.
Překladač ti nikdy neřekne: "budeme kamarádi"
3.11.2007 14:12 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Na vzorovém html to funguje perfektně, ale pro reálné, které má v některých <tr> parametr bgcolor s různými hodnotami a v některých <td> je zarovnání, se mi to nedaří upravit. Jdu na to správně tímto způsobem:
<tr[^>]*>([^<]*)</td>\s*                # První buňka
?
zoul avatar 3.11.2007 19:31 zoul | skóre: 43 | blog: | Boskovice
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Jo, jdeš na to dobře, akorát tam máš chybu (překřížený tag). Tohle by mělo fungovat:
#!/usr/bin/env perl -w0n

my @ctx = m{
	<tr[^>]*>\s*
	<td[^>]*>([^<]*)</td>\s*
	<td[^>]*>([^<]*)</td>\s*
	(?:<td[^>]*>[^<]*</td>\s*)*
	<td[^>]*><input\s*onclick="(.*?)">
	(?{print "$1;$2;$3\n"})
}gsx;
Byl bych řekl, že místo těžkopádného [^>]* (cokoliv kromě znaku >) bude fungovat i skromné srovnávání (.*?), ale to mi z nějakého důvodu nešlo.
zoul avatar 3.11.2007 19:34 zoul | skóre: 43 | blog: | Boskovice
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
P.S. Na nedávno skončené Pittsburgské perlové dílně se objevila přednáška Essential Perl One-liners [PDF], stručné a užitečné čtení.
3.11.2007 20:09 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Prožeňte to HTML Tidy, ať z toho získáte XHTML (jsou tací, kteří tvrdí, že to, že HTML není XML není žádná nevýhoda), a pak použijte následující XSLT:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  
  <xsl:output method="text"/>

  <xsl:template match="/html/body/table/tbody/tr/td/div/table/tbody/tr[td[last()]/input]">
<xsl:value-of select="td[1]"/>;<xsl:value-of select="td[2]"/>;<xsl:value-of select="td[last()]/input/@onclick"/>
<xsl:text>&#13;&#10;</xsl:text>
  </xsl:template>
	
  <xsl:template match="*"><xsl:apply-templates select="*" /></xsl:template>
</xsl:stylesheet>
5.11.2007 13:24 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Někde v té XSLT je chyba - nic se na stdout nevypíše. Když spustím xsltproc ukecaně, tak na stderr vypíše toto:
creating dictionary for stylesheet
reusing dictionary from opory.xsl for stylesheet
xsltParseStylesheetProcess : found stylesheet
xsltPrecomputeStylesheet: removing ignorable blank node
xsltParseTemplateContent: removing text
xsltCompilePattern : parsing '/html/body/table/tbody/tr/td/div/div/table/tbody/tr[td[last()]/input]'
xsltCompilePattern : parsed /html/body/table/tbody/tr/td/div/div/table/tbody/tr[td[last()]/input], default priority 0.500000
added pattern : '/html/body/table/tbody/tr/td/div/div/table/tbody/tr[td[last()]/input]' priority 0.500000
xsltCompilePattern : parsing '*'
xsltCompilePattern : parsed *, default priority -0.500000
added pattern : '*' priority -0.500000
parsed 2 templates
Resolving attribute sets references
Creating sub-dictionary from stylesheet for transformation
Registered 0 modules
reusing transformation dict for output
Registering global variables
Registering global variables from opory.xsl
xsltProcessOneNode: no template found for /
xsltProcessOneNode: applying template '*' for html
xsltApplyTemplates: node: 'html'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 2 nodes
(...)
xsltProcessOneNode: applying template '*' for tr
xsltApplyTemplates: node: 'tr'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 6 nodes
xsltProcessOneNode: applying template '*' for td
xsltApplyTemplates: node: 'td'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 0 nodes
xsltProcessOneNode: applying template '*' for td
xsltApplyTemplates: node: 'td'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 0 nodes
xsltProcessOneNode: applying template '*' for td
xsltApplyTemplates: node: 'td'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 0 nodes
xsltProcessOneNode: applying template '*' for td
xsltApplyTemplates: node: 'td'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 0 nodes
xsltProcessOneNode: applying template '*' for td
xsltApplyTemplates: node: 'td'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 0 nodes
xsltProcessOneNode: applying template '*' for td
xsltApplyTemplates: node: 'td'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 1 nodes
xsltProcessOneNode: applying template '*' for input
xsltApplyTemplates: node: 'input'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 0 nodes
a v podobném duchu pokračuje dalších ~ 17k řádků.
5.11.2007 13:49 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Asi to html vypadá trochu jinak, než jak vypadal příklad uvedený zde v diskuzi. Bude potřeba upravit ten XPath výraz
/html/body/table/tbody/tr/td/div/table
tak, aby se chytil na tu správnou tabulku. Pokud v tom html jsou nějaká id, je nejlepší se chytit na ně. Jinak je potřeba zvolit správné pořadí elementů. Pokud ty tagy <input> jinde na stránce nejsou, můžete taky zkusit
/html/body//table/tbody/tr[td[last()]/input]
5.11.2007 23:34 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Jediný rozdíl je, že jsou v sobě dva div-y, což jsem přidal do xpath výrazu:
/html/body/table/tbody/tr/td/div/div/table/tbody/tr[td[last()]/input]
a výsledek jsem posílal minule.
Pokud v tom html jsou nějaká id, je nejlepší se chytit na ně.
Vnější div má id "p_r_i_n_t". Zkusil jsem vztáhnout xpath výraz od něj:
id('p_r_i_n_t')/div/table/tbody/tr[td[last()]/input]
a výsledek se od předchozího nijak neliší:
 Celé XML sem nechci posílat, tak dávám alespoň odkaz na zastřelenou obrazovku DOM inspektoru.
            
6.11.2007 09:05 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Zkusil bych
//div[@id='p_r_i_n_t']/div/table/tbody/tr[td[last()]/input]
A podívejte se, jak jsou tagy zapsané v tom očištěném (XHTML) souboru, zda jsou malými písmeny, resp. přizpůsobte velikost písmen v XPath. Případně sem pošlete (nebo někam vystavte, přinejhorším pošlete e-mailem) alespoň začátek to XML – aby tam byl alespň jeden řádek s daty. Ta data a texty klidně nahraďte něčím jiným.
6.11.2007 13:05 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Díky za tip. Tagy v očištěném xhtml jsou všechny malými písmeny, hodnoty atributů jsou všechny v apostrofech. Nicméně DOM inspektor pěkně kecá, protože žádný tag tbody v původním ani očištěném html není! Očištěné xhtml už je lidsky čitelné a relevantní část vypadá takto:
<div id='p_r_i_n_t'>
<div align='center'>
<h2>nadpis 2</h2>
<p>lorem ipsum ...</p>
<table border='1'>
<tr>
<th>nadpis 1</th>
<th>nadpis 2</th>
<th>nadpis 3</th>
<th>nadpis 4</th>
<th>nadpis 5</th>
<th>nadpis 6</th>
</tr>
<tr bgcolor="">
<td>text11</td>
<td>text12</td>
<td>text13</td>
<td align='right'>text14</td>
<td align='right'>text15</td>
<td><input type='button' value='Otevřít' onclick=
'js_fce("id")' /></td>
</tr>
<tr bgcolor="#FFCCCC">
<td>text21</td>
<td>text22</td>
<td>text23</td>
<td align='right'>text24</td>
<td align='right'>text25</td>
<td><input type='button' value='Otevřít' onclick=
'js_fce("id")' /></td>
</tr>
(...)
</table>
</div>
</div>
Xpath výraz jsem podle toho upravil takto:
//div[@id='p_r_i_n_t']/div/table/tr[td[last()]/input]
a xsltproc si stále mele svou:
creating dictionary for stylesheet
reusing dictionary from opory.xsl for stylesheet
xsltParseStylesheetProcess : found stylesheet
xsltPrecomputeStylesheet: removing ignorable blank node
xsltParseTemplateContent: removing text
xsltCompilePattern : parsing '//div[@id='p_r_i_n_t']/div/table/tr[td[last()]/input]'
xsltCompilePattern : parsed //div[@id='p_r_i_n_t']/div/table/tr[td[last()]/input], default priority 0.500000
added pattern : '//div[@id='p_r_i_n_t']/div/table/tr[td[last()]/input]' priority 0.500000
xsltCompilePattern : parsing '*'
xsltCompilePattern : parsed *, default priority -0.500000
added pattern : '*' priority -0.500000
parsed 2 templates
Resolving attribute sets references
Creating sub-dictionary from stylesheet for transformation
Registered 0 modules
reusing transformation dict for output
Registering global variables
Registering global variables from opory.xsl
xsltProcessOneNode: no template found for /
xsltProcessOneNode: applying template '*' for html
xsltApplyTemplates: node: 'html'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 2 nodes
(...)
xsltProcessOneNode: applying template '*' for div
xsltApplyTemplates: node: 'div'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 1 nodes
xsltProcessOneNode: applying template '*' for div
xsltApplyTemplates: node: 'div'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 3 nodes
xsltProcessOneNode: applying template '*' for h2
xsltApplyTemplates: node: 'h2'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 0 nodes
xsltProcessOneNode: applying template '*' for p
xsltApplyTemplates: node: 'p'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 0 nodes
xsltProcessOneNode: applying template '*' for table
xsltApplyTemplates: node: 'table'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 531 nodes
(radek s nadpisy)
xsltProcessOneNode: applying template '*' for td
xsltApplyTemplates: node: 'td'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 0 nodes
xsltProcessOneNode: applying template '*' for td
xsltApplyTemplates: node: 'td'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 0 nodes
xsltProcessOneNode: applying template '*' for td
xsltApplyTemplates: node: 'td'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 0 nodes
xsltProcessOneNode: applying template '*' for td
xsltApplyTemplates: node: 'td'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 0 nodes
xsltProcessOneNode: applying template '*' for td
xsltApplyTemplates: node: 'td'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 0 nodes
xsltProcessOneNode: applying template '*' for td
xsltApplyTemplates: node: 'td'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 1 nodes
xsltProcessOneNode: applying template '*' for input
xsltApplyTemplates: node: 'input'
xsltApplyTemplates: select *
xsltApplyTemplates: list of 0 nodes
6.11.2007 14:10 razor | skóre: 32
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Zdar, na to očištěné xhtml mi funguje tento stylesheet:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  
  <xsl:output method="text"/>

<xsl:template match="tr[td[last()]/input]"> <xsl:value-of 
select="td[1]"/>;<xsl:value-of select="td[2]"/>;<xsl:value-of 
select="td[last()]/input/@onclick"/> <xsl:text>
</xsl:text> 
</xsl:template>

<xsl:template match="/">
    <xsl:apply-templates select="//div[@id='p_r_i_n_t']/div/table"/>
</xsl:template>

</xsl:stylesheet> 

6.11.2007 14:34 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Někdy se vyplatí nekotvit ten XPath výraz moc pečlivě :-) Takže s přeskočením nezajímavých textů by to mělo vypadat:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  
  <xsl:output method="text"/>

  <xsl:template match="tr[td[last()]/input]"><xsl:value-of 
    select="td[1]"/>;<xsl:value-of select="td[2]"/>;<xsl:value-of 
    select="td[last()]/input/@onclick"/><xsl:text>&#13;&#10;</xsl:text> 
  </xsl:template>

  <xsl:template match="/">
    <xsl:apply-templates select="//div[@id='p_r_i_n_t']/div/table"/>
  </xsl:template>

  <xsl:template match="*"><xsl:apply-templates select="*" /></xsl:template>

</xsl:stylesheet> 
6.11.2007 15:29 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Hm, je zajímavé, že pokud oříznu celý strom XHTML na větev od <div> níže, transformace funguje, ale pokud mu podstrčím celé html, tak se mu nechce. Mimochodem umí XSL vyříznout z onoho <input onclick='jsFunkce("číselné_ID")'/>; ono číselné_ID?
6.11.2007 15:47 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Není na začátku toho html uveden v tagu <html> jmenný prostor? Ale to by snad xsltproc něco zahlásil…

Pokud je jsFunkce("…") (to okolo) vždy stejné, dalo by se použít funkcí substring a string-length, případně replace. Např.
<xsl:value-of select="replace(td[last()]/input/@onclick,'jsFunkce\(&quot;(.*)&quot;\)','$1')"/>
6.11.2007 16:12 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Vypadá takto:
<html xmlns="http://www.w3.org/1999/xhtml">
Pokud je jsFunkce("…") (to okolo) vždy stejné, dalo by se použít funkcí substring a string-length, případně replace.
Je. Takto to vypadá dobře, jestli to bude funkční uvidíme až po vyřešení toho namespace. :-)
6.11.2007 16:23 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Přidejte ten namespace na začátek toho XSLT jako defaultní NS:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://www.w3.org/1999/xhtml"
  version="1.0">
…
6.11.2007 17:11 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Toto nepomohlo, tak jsem to dal pryč a místo toho umazal sedem zmínku o NS z tagu <html>. :-] (sed tam už stejně byl, nahrazoval entity &nbsp; na kterých xsltproc řval). Když jsem použil replace, tak to nahradilo pouze první řádek, tak jsem přesunul i tyto do sedu a tak se mi povedlo dostat vytoužené CSV:
sed -e 's/\&nbsp;/ /g;s/<html[^>]*>/<html>/;s/jsFunkce(\"\([^"]*\)\")/\1/;'
Díky všem za čas a pomoc. ;-)
6.11.2007 14:38 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Nicméně DOM inspektor pěkně kecá, protože žádný tag tbody v původním ani očištěném html není!
No jo, na tenhle oblíbený trik jsem zapomněl. On zobrazuje skutečný aktuální DOM dokumentu, tj. to co vznikne parsováním a „hádáním“ toho, jak ten dokument má správně vypadat.
5.11.2007 13:57 Pavel Kysilka
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
tipuju, ze to nepujde proto, ze tidy Vam prida do html definici dokumentu a potom musite k jednotlivym elementum pristupovat pres namespace.

Coz se da poresit tim, ze umazete DOCTYPE nebo xmlns namespace atribut vysledneho dokumentu z tidy.

pripadne mi poslete mail a vysledna transformce se sem da hodit.

bye gf
5.11.2007 14:13 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Předpokládám, že by se o namespacech xsltproc v tom ukecaném výstupu zmínilo.
2.11.2007 11:28 Tomáš | skóre: 29 | blog: Tomik
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Na podobne veci taham kanon v podobe Pythonu. Pokud je to HTML validni XML (zejmena nema neparove tagy), tak se da naparsovat do DOMu (neco na to v Pythonu je, ale myslim, ze ne ve standardni instalaci), a potom zkousim.

Ten xslt styl je taky dobry napad. Neni mi moc jasne, proc se Ti nedari dostat, co potrebujes. Pomoci xpath se dostanes na tu spravnou tabulku a potom zkousis, jestli je tam onclick.
2.11.2007 11:37 Pavel Kysilka
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
zdravim,

podelte se s nami o xslt transformaci a jak to stihnu, tak Vam nejak poradim kudy dale. Zrovna resim csv formaty pro socialku generovane z xml. NIcmene si myslim, ze toto je jiz davno nekde hotovo.

Nic proti jinym resenim, ale:

mely by zvladnout toto, protoze jinak jsou chybne.

<td

atribut="hodnota"

>

text0

text1 s odelovacem

text2 s html entitou

>/td>

<td/>

a tak dale

bye gf
2.11.2007 11:54 Pavel Kysilka
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
jeste me napadlo. vemte html tabulku a zpracujte ji kancelarskym balikem[OpenOffice,AbiWord) (jako sesit). Tedy pokud mate maly pocet dat.

gf
2.11.2007 22:31 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: Jak vypreparovat data z HTML tabulky do CSV?
Ak toho nie je príliš veľa, tak sa dá použiť aj kombinácia Firefox+Greasemonkey+skript.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.