Kirjoittaja Aihe: html tiedostojen joukkosiivous tekstitiedostoiksi  (Luettu 5248 kertaa)

Daneli

  • Käyttäjä
  • Viestejä: 1037
  • Red Hat Chili Peppers
    • Profiili
    • www.daneli.org
Minulla on 960 html sivua. Jokainen sivu sisältää virren sanat. Tavoite on muuntaa tiedostot txt utf-8 tiedostoiksi, jolloin saisin kaikki virret kerralla näytettäviksi stream lähetyksissä obs:ssä.

Virren sanat ovat: <article> virrensanat </article>. 

Eli kaikista tiedostoista pitäisi poistaa kaikki muut paitsi <article> </article> välissä olevat tekstit.

Olen yrittänyt greb komentoa mutta vielä en ole onnistunut?

Vinkkejä ideoita?

jarilind

  • Käyttäjä
  • Viestejä: 30
    • Profiili
Vs: html tiedostojen joukkosiivous tekstitiedostoiksi
« Vastaus #1 : 01.03.22 - klo:16.51 »
sed

kamara

  • Käyttäjä
  • Viestejä: 3031
    • Profiili
Vs: html tiedostojen joukkosiivous tekstitiedostoiksi
« Vastaus #2 : 01.03.22 - klo:20.25 »
No, tässä on valmis pythonohjelma...
(itse en oikein tykkää regex:stä, kun niissä on syntaksi liian tiiviinä omaan silmääni.)

Koodia: [Valitse]
cat ohjelma.py
ohjelma.py-tiedosto näyttää seuraavalta...
Koodia: [Valitse]
import sys
if __name__== "__main__":
    if len(sys.argv) >1:
        filename=sys.argv[1]
        tiedosto = open(filename, "r")
        rivit = tiedosto.readlines()
        tiedosto.close()
        s=""
        for rivi in rivit:
            s=s+rivi
        rivit=s
        while rivit.find("<article>")>=0:
            rivit=rivit[rivit.find("<article>")+9:]
            print(rivit[0:rivit.find("</article>")])

syötteenä annetaan html-tiedoston nimi. Ohjelma olettaa, että jokaista <article>-tagia seuraa </article>-lopetustagi.

Jos syötteenä on seuraava...
Koodia: [Valitse]
<article> virrensanat 1</article>
<article> virrensanat 2</article>
<article> virrensanat 3</article>
<article> virrensanat 4</article>

Koodia: [Valitse]
python3 ohjelma.py
...niin tulos on seuraava:
Koodia: [Valitse]
<article> virrensanat 1</article>
<article> virrensanat 2</article>
<article> virrensanat 3</article>
<article> virrensanat 4</article>

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: html tiedostojen joukkosiivous tekstitiedostoiksi
« Vastaus #3 : 03.03.22 - klo:19.18 »
Pythonilla itsekin lähdin tätä miettimään, niin jostain syystä tämä seuraavaksi esittämäni koodi käy tosiaan kaikki nuo 15 html -tiedoston riviä läpi iteroituna tuossa silmukassa, jossa tuo louhiVirsi(x) -metodin kutsu on, mutta sitten lopputulosteessa päätteelle tulostuu "None" molempien <article> -tagien välissä olevan sisällön sijaan. Mitenkäs tämän laita?

Tässä nyt ensin tämä virret.html -tiedosto, jonka loin malliksi
Koodia: [Valitse]
<!DOCTYPE html>
<html>
<head><title>Virsi-kirja</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8"/>
</head>
<body>

<h1>Virret</h1>
<article>Virsi 1</aRticle>
<br>
<article>Virsi 2</aRticle>

</body>
</html>

Sitten virsiLouhi.py -tiedoston sisältö, jonka ohjelmoin:

Koodia: [Valitse]
import codecs

def louhiVirsi(x):
startTag = '<article>'
endTag = '</article>'
try:
alku = x.index(startTag)
loppu = x.index(endTag)
if (alku >0 and loppu > 0):
result = string[x[alku+1]:x[loppu-1]]
return result
except:
return False;

content = codecs.open("virret.html", "r", "utf-8").read().splitlines()
for x in range(len(content)):
temp = louhiVirsi(content[x].lower())
if (temp == False):
continue
else:
print (temp)


Ja lopuksi päätteen tuloste, kun ajaa py virsiLouhi.py -tuolla pythonin tulkilla.
Koodia: [Valitse]
None
None
Tuo ohjelmakoodi python-tulkilla ajettuna löytää nuo <article> -tagit, mutta jostain syystä tuo louhiVirsi(x) -metodi ei palauta tuota merkkijonoa, joka on noiden tagien välissä, vaan "None".

Jotain vinkkiä tästä tai tähän, mitä havaintoja tästä teette?
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

nm

  • Käyttäjä
  • Viestejä: 16428
    • Profiili
Vs: html tiedostojen joukkosiivous tekstitiedostoiksi
« Vastaus #4 : 03.03.22 - klo:22.49 »
Minulla on 960 html sivua. Jokainen sivu sisältää virren sanat. Tavoite on muuntaa tiedostot txt utf-8 tiedostoiksi, jolloin saisin kaikki virret kerralla näytettäviksi stream lähetyksissä obs:ssä.

Virren sanat ovat: <article> virrensanat </article>. 

Eli kaikista tiedostoista pitäisi poistaa kaikki muut paitsi <article> </article> välissä olevat tekstit.

Olen yrittänyt greb komentoa mutta vielä en ole onnistunut?

Vinkkejä ideoita?

xmllint ja sen xpath-kyselytoiminto auttaa ainakin validin XML-muotoisen HTML5:n ja XHTML:n kanssa:

Koodia: [Valitse]
xmllint --xpath '//article/text()' input.html
xmllint sijaitsee paketissa libxml2-utils. Jos tiedostot ovat jossain vanhemmassa HTML-formaatissa, voit kokeilla xmllintin vipua --html, mutta se ei välttämättä auta kaikissa tapauksissa.



Tuo ohjelmakoodi python-tulkilla ajettuna löytää nuo <article> -tagit, mutta jostain syystä tuo louhiVirsi(x) -metodi ei palauta tuota merkkijonoa, joka on noiden tagien välissä, vaan "None".

Jotain vinkkiä tästä tai tähän, mitä havaintoja tästä teette?

Korjaa if-lauseen ehto (tai poista tarpeeton if-lause kokonaan), ja korjaa merkkijonon viipalointi:

Koodia: [Valitse]
if (alku >0 and loppu > 0):
result = string[x[alku+1]:x[loppu-1]]
return result
-->
Koodia: [Valitse]
if (alku >= 0 and loppu > 0):
  result = x[alku+len(startTag):loppu-1]
return result

Lisäksi tuossa on ongelmana ainakin isojen kirjainten vaihtuminen pieniin myös tulosteessa, sekä useammalle kuin yhdelle riville jakautuvien article-elementtien tulkinta, koska syötettä käsitellään riveittäin.
« Viimeksi muokattu: 03.03.22 - klo:23.23 kirjoittanut nm »

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: html tiedostojen joukkosiivous tekstitiedostoiksi
« Vastaus #5 : 04.03.22 - klo:05.45 »
Kiitos avusta, "nm"!

Nyt tosiaan päätetuloste ohjelmaa ajettaessa tulostaa tagien välissä olevan merkkijonon.

Lopullinen virsiLouhi.py -tiedosto näyttää seuraavalta nm:n korjausehdouksen jälkeen:

Koodia: [Valitse]
import codecs

def louhiVirsi(x):
startTag = '<article>'
endTag = '</article>'
try:
alku = x.index(startTag)
loppu = x.index(endTag)
if (alku >= 0 and loppu > 0):
  result = x[alku+len(startTag):loppu-1]
return result
except:
return False;

content = codecs.open("virret.html", "r", "utf-8").read().splitlines()
for x in range(len(content)):
temp = louhiVirsi(content[x].lower())
if (temp == False):
continue
else:
print (temp)

Tuosta ylläolevasta versiosta on hyvä lähteä kehittämään versiota, joka tulostaa tagien välisen merkkijonosisällön myös silloin, jos kaikki ei ole samalla rivillä, tai yksi tagi-pari -sisältöineen samalla rivillä voihan niitä olla useampia, kun HTML5-syntaksi on validi, vaikka olisi ylimääräisiä välilyöntejä tai rivivaihtomerkkejä missä tahansa kohtaa dokumenttia.

Nyt lopullinen tuloste Python-tulkilla suorittamisen jälkeen on seuraava:

py virsiLouhi.py
Koodia: [Valitse]
virsi
virsi
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: html tiedostojen joukkosiivous tekstitiedostoiksi
« Vastaus #6 : 05.03.22 - klo:15.06 »
Saitko "Daneli", kun avasit tämän ketjun, niin virsien sanat tulosteena.

Mitä tuossa pistin merkille, tuo 960 erillistä html-dokumenttia aika määrä, niin voisin muokata tuota python-ohjelmaani, että jos tiedostonnimen saisi annettua ajettaessa ohjelmaa komentoriviltä parametrina, ja sitten jos html-tiedostot olisi loogisesti nimetty, esim virsi1.html, virsi2.html jne... niin voisi Linuxissa tehdä bash-skriptin, joka käy for - silmukassa ajaen tuon python-tulkin jokaisen tiedoston parametrina antaen, niin ei mene ikä ja terveys kun joutuisi muuten manuaalisesti käsipelillä tiedosto kerrallaan vekslaamaan.

Automatisoidaan hieman tätä virrenveisuun mahdollistavaa prosessia.

Katson seuraavaksi korjauksen tuohon python skriptiin, jos saan siihen parametrisyotteeltä tuon html-tiedoston nimen, ja mahdollisesti voin ohjelmoida bash-skriptin, jonka sitten vain ajat Linux-päätteeltä bash-komentotulkista.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

nm

  • Käyttäjä
  • Viestejä: 16428
    • Profiili
Vs: html tiedostojen joukkosiivous tekstitiedostoiksi
« Vastaus #7 : 05.03.22 - klo:15.20 »
Automatisoidaan hieman tätä virrenveisuun mahdollistavaa prosessia.

Tässä valmis skripti:

Koodia: [Valitse]
for input in *.html; do xmllint --xpath '//article/text()' "$input" > $(basename "$input" .html).txt; done

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: html tiedostojen joukkosiivous tekstitiedostoiksi
« Vastaus #8 : 05.03.22 - klo:15.43 »
Automatisoidaan hieman tätä virrenveisuun mahdollistavaa prosessia.

Tässä valmis skripti:

Koodia: [Valitse]
for input in *.html; do xmllint --xpath '//article/text()' "$input" > $(basename "$input" .html).txt; done


Hienoa, tuo varmaankin toimii, olitpa nopea, "nm", itse lähdin selvittämään tuota python-skriptini komentokehoitteelta annetun parametrin käsittelyä, ja sain kun sainkin sen toimimaan.

Laitan tähän nyt vielä tuon python-ohjelmani, joka huomioi myos virhetilanteet tuota komentoa annettaessa, vaikka yleensä en näin lopputeollista ohjelmaa toteutakaan, vaan keskityn pelkästään toimivaan ohjelmaan, no tämä ohjelma on valmis luovutettavaksi asiakkaalle, eli Danelille, tai muillekin, jos joku tykkää kopioida tämän ohjelman johonkin käyttotarkoitukseen, tiedä jos joku jotain käyttoä tällekin loytää tai joku tykkää jatkaa tuotekehittelyä omiksi tarpeiksi sopivaan kuosiin tätä.

Koodia: [Valitse]
import codecs
import sys

def louhiVirsi(x):
startTag = '<article>'
endTag = '</article>'
try:
alku = x.index(startTag)
loppu = x.index(endTag)
if (alku >= 0 and loppu > 0):
  result = x[alku+len(startTag):loppu-1]
return result
except:
return False;
if (len(sys. argv) <2):
    print ("Syntaksi: py " +sys.argv[0] +" tiedosto.html")
else:
    try:
        content = codecs.open(sys.argv[1][0:], "r", "utf-8").read().splitlines()

        for x in range(len(content)):
            temp = louhiVirsi(content[x].lower())
            if (temp == False):
                continue
            else:
                print (temp)
    except:
        print ("Tiedoston luku epäonnistui!");
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: html tiedostojen joukkosiivous tekstitiedostoiksi
« Vastaus #9 : 05.03.22 - klo:19.07 »
Vielä illan päätteeksi ennen kuin pistän koneen kiinni tältä erää, lisään vielä tuohon python-skriptiini sopivan bash-skriptin, jolla myos saa noista vajaasta tuhannesta erillisestä .html -tiedostosta virren sanat louhittua tekstitiedostoihin.

Koodia: [Valitse]
#!/bin/bash

for input in *.html; do python ./louhi.py "$input" > $(basename "$input" .html).txt; done

Ei se nyt paljoa eroa tuosta "nm":n esityksestä, mutta osaltani tämä on paketissa, enää mitään ihmeempää taikatemppua tähän ei liene enää voitavan keksiä.

Tuo nm:n valmis skripti selkeä, mutta tämä bash-skripti nyt on nyt ja sitten, jos tykkää tuota python-skriptiäni käyttää tässä casessa, niin omalta osaltani homma loppuun vietynä nyt, kun itse alunperin nostin esille tuon bashin.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

K-Veikko

  • Käyttäjä
  • Viestejä: 309
    • Profiili
Vs: html tiedostojen joukkosiivous tekstitiedostoiksi
« Vastaus #10 : 08.03.22 - klo:11.48 »

Virren sanat ovat: <article> virrensanat </article>. 

Eli kaikista tiedostoista pitäisi poistaa kaikki muut paitsi <article> </article> välissä olevat tekstit.

Itse pandocin suurkäyttäjänä kokeilisin ensin
Koodia: [Valitse]
cat input.html | pandoc -f html -t plain -ja siitä sitten eteenpäin ...
plain(text)'in ohella voi kokeilla muitakin tulostus formaatteja, joita löytyy 45 erilaista.

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: html tiedostojen joukkosiivous tekstitiedostoiksi
« Vastaus #11 : 10.03.22 - klo:11.44 »
Itse pandocin suurkäyttäjänä kokeilisin ensin
Koodia: [Valitse]
cat input.html | pandoc -f html -t plain -ja siitä sitten eteenpäin ...
plain(text)'in ohella voi kokeilla muitakin tulostus formaatteja, joita löytyy 45 erilaista.

Tuo pandoc oli itselleni uusi, mitä katsoin tuota manuaalisivua, niin aika monipuolisen oloinen valikoima eri kytkimiä ja noiden tuettujen merkintäkieli, ja tekstiformaattien osalta tarjonta. Näytti olevan jokin tuki myos Mikkiksen .docx -tiedostollekin, mikä on aika harvinaista millekään Linux-ohjelmalle oman kokemukseni mukaan.

Katsoin myos tuon John Mac Farlanen käyntikortin netissä, niin aika kattava akateemisten julkaisujen meriittihistoria miehellä, mutta toisaalta mies on Berkeleyn yliopiston filosofian professori, eli kaiken kaikkiaan ei mikään ihme, kun katsoo tuota melko kattavaa julkaisulistaa, mitä mies esittää sivuillaan, niin kyse on melko uniikista tieteentekijästä lopulta, tai ei nyt niin poikkeuksellista, mutta ei ihme, että mies on oppituolin haltijana Californiassa Berkeleyssä tällä hetkellä.

en tiedä, mikä tuo pandoc -ohjelman ristimänimen etymologia tai historia siihen liittyy, mutta vaikka "doc" -viittaa dokumenttiin "document" -sanasta, ja pan -merkityksen saattaa arvailla, mutta doctor's ordrer on source code down at pandoc, general markup converter Unix/Linux tool, niin tämä vaikuttaa hyvältä, että pidetään mielessä tämä pandoc -tyokalu.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

mniem

  • Käyttäjä
  • Viestejä: 51
    • Profiili
Vs: html tiedostojen joukkosiivous tekstitiedostoiksi
« Vastaus #12 : 10.03.22 - klo:17.04 »
Lainaus
Katsoin myos tuon John Mac Farlanen käyntikortin netissä, niin aika kattava akateemisten julkaisujen meriittihistoria miehellä, mutta toisaalta mies on Berkeleyn yliopiston filosofian professori, eli kaiken kaikkiaan ei mikään ihme, kun katsoo tuota melko kattavaa julkaisulistaa, mitä mies esittää sivuillaan, niin kyse on melko uniikista tieteentekijästä lopulta, tai ei nyt niin poikkeuksellista, mutta ei ihme, että mies on oppituolin haltijana Californiassa Berkeleyssä tällä hetkellä.
Erikoisen miehestä tekee se, että hän on kirjoittanut yksin kaikki paperit. Jos otat Google Scholaritsa summamutikassa minkä hyvänsä satunnaisen julkaisun, niin kirjoittajia yleensä vähintään kaksi. Tämän vuoksi professoreilla on tyypillisesti kolminumeroinen luku julkaisuja.