abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 04:44 | Nová verze

    Nová čísla časopisů od nakladatelství Raspberry Pi: MagPi 140 (pdf) a HackSpace 77 (pdf).

    Ladislav Hagara | Komentářů: 0
    dnes 01:00 | Nová verze

    ESPHome, tj. open source systém umožňující nastavovat zařízení s čipy ESP (i dalšími) pomocí konfiguračních souborů a připojit je do domácí automatizace, například do Home Assistantu, byl vydán ve verzi 2024.4.0.

    Ladislav Hagara | Komentářů: 0
    včera 22:11 | IT novinky Ladislav Hagara | Komentářů: 0
    včera 20:55 | Nová verze

    Neziskové průmyslové konsorcium Khronos Group vydalo verzi 1.1 specifikace OpenXR (Wikipedie), tj. standardu specifikujícího přístup k platformám a zařízením pro XR, tj. platformám a zařízením pro AR (rozšířenou realitu) a VR (virtuální realitu). Do základu se z rozšíření dostalo XR_EXT_local_floor. Společnost Collabora implementuje novou verzi specifikace do platformy Monado, tj. open source implementace OpenXR.

    Ladislav Hagara | Komentářů: 2
    včera 17:22 | Nová verze

    Byla vydána nová verze 0.38.0 multimediálního přehrávače mpv (Wikipedie) vycházejícího z přehrávačů MPlayer a mplayer2. Přehled novinek, změn a oprav na GitHubu. Požadován je FFmpeg 4.4 nebo novější a také libplacebo 6.338.2 nebo novější.

    Ladislav Hagara | Komentářů: 3
    včera 17:11 | Nová verze

    ClamAV (Wikipedie), tj. multiplatformní antivirový engine s otevřeným zdrojovým kódem pro detekci trojských koní, virů, malwaru a dalších škodlivých hrozeb, byl vydán ve verzích 1.3.1, 1.2.3 a 1.0.6. Ve verzi 1.3.1 je mimo jiné řešena bezpečnostní chyba CVE-2024-20380.

    Ladislav Hagara | Komentářů: 2
    včera 12:11 | IT novinky

    Digitální a informační agentura (DIA) oznámila (PDF, X a Facebook), že mobilní aplikace Portál občana je ode dneška oficiálně venku.

    Ladislav Hagara | Komentářů: 8
    včera 05:11 | Komunita

    #HACKUJBRNO 2024, byly zveřejněny výsledky a výstupy hackathonu města Brna nad otevřenými městskými daty, který se konal 13. a 14. dubna 2024.

    Ladislav Hagara | Komentářů: 2
    17.4. 17:55 | IT novinky

    Společnost Volla Systeme stojící za telefony Volla spustila na Kickstarteru kampaň na podporu tabletu Volla Tablet s Volla OS nebo Ubuntu Touch.

    Ladislav Hagara | Komentářů: 3
    17.4. 17:44 | IT novinky

    Společnost Boston Dynamics oznámila, že humanoidní hydraulický robot HD Atlas šel do důchodu (YouTube). Nastupuje nová vylepšená elektrická varianta (YouTube).

    Ladislav Hagara | Komentářů: 1
    KDE Plasma 6
     (68%)
     (10%)
     (2%)
     (19%)
    Celkem 560 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    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: 1379×
    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: 70
    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: 72 | 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: 72 | 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: 51 | 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: 51 | 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: 51 | 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: 70
    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: 68 | 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: 68 | 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: 68 | 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: 33
    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: 68 | 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: 68 | 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: 68 | 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: 68 | 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: 68 | 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: 31 | 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.