Script ausführen mit Pfad als Argument
-
- User
- Beiträge: 10
- Registriert: Freitag 15. November 2019, 18:19
Hmm... konnte jetzt irgendwas starten, indem ich den Befehl "keep.py alt/*.html" ausgeführt hab. Was ja früher nicht ging... Es rennen nun ähnlich dem Film Matrix etliche Symbole über meinen Bildschirm. Aber ich kann nicht erkennen ob irgendwas passiert. Ich ging eigentlich davon aus, das Script würde daraus .enex Files machen. Oder bearbeitet es nur den Inhalt? Die Ánzahl der Dateien im Ordner "alt" schwankt gelegentlich um 3 in der Summe.
Es ist als lese das Script zwar die Dateien, ändert vor meinen Augen den Inhalt aber legt nichts ab
EDIT: Deets, "alt" ist ein Ordner. Keine Datei. Es sollen ja alle im Unterordner "alt" befindlichen HTML Dateien mit dem Script bearbeitet werden.
https://ibb.co/JdMTcLw
Es ist als lese das Script zwar die Dateien, ändert vor meinen Augen den Inhalt aber legt nichts ab

EDIT: Deets, "alt" ist ein Ordner. Keine Datei. Es sollen ja alle im Unterordner "alt" befindlichen HTML Dateien mit dem Script bearbeitet werden.
https://ibb.co/JdMTcLw
Das Skript schreibt das Resultat in die Standardausgabe. Von da musst du es weiterverarbeiten. Zb indem du es in eine Datei umlenkst. Unter Unix mit “kommando > datei”. Dann landet die Ausgabe in datei. Aber wie das unter Windows/CMD.EXE geht, muss entweder wer anders dir verraten, oder du recherchierst das selbst.
-
- User
- Beiträge: 10
- Registriert: Freitag 15. November 2019, 18:19
Ja, wobei das laut Beschreibung ja anders sein sollte.
Hier https://gitlab.com/charlescanato/googl ... /issues/4 hat das ja auch jemand angemerkt und das script wie folgt unten angepasst.
Allerdings erhalte ich dann wieder
Wenn Linux die Lösung ist, setze ich auch gerne eine Distri unter VM auf. Das soll nicht das Problem sein
Hier https://gitlab.com/charlescanato/googl ... /issues/4 hat das ja auch jemand angemerkt und das script wie folgt unten angepasst.
Code: Alles auswählen
#!/usr/bin/env python3
# originally created and posted by user dgc on
# https://discussion.evernote.com/topic/97201-how-to-transfer-all-the-notes-from-google-keep-to-evernote/
# until now, Google Takeout for Keep does NOT export:
# - correct order of lists notes (non-checked first, checked last)
# - list items indentation
import sys
import re
import parsedatetime as pdt
import time
cal = pdt.Calendar()
r1 = re.compile(
'<li class="listitem checked"><span class="bullet">☑</span>.*?<span class="text">(.*?)</span>.*?</li>')
r2 = re.compile('<li class="listitem"><span class="bullet">☐</span>.*?<span class="text">(.*?)</span>.*?</li>')
r3 = re.compile('<span class="chip label"><span class="label-name">([^<]*)</span>[^<]*</span>')
f = open("export.enex", "w+")
def readlineUntil(file, str):
currLine = ""
while not str in currLine:
currLine = file.readline()
return currLine
def mungefile(fn):
fp = open(fn, 'r')
# title = fp.readline().strip()
title = readlineUntil(fp, "<title>").strip()
title = title.replace('<title>', '').replace('</title>', '')
readlineUntil(fp, "<body>")
t = fp.readline()
tags = ''
if '"archived"' in t:
tags = '<tag>archived</tag>'
fp.readline() # </div> alone
date = fp.readline().strip().replace('</div>', '')
dt, flat = cal.parse(date)
iso = time.strftime('%Y%m%dT%H%M%SZ', time.gmtime(time.mktime(dt)))
fp.readline() # extra title
# I still couldn't import a note with an image attachment
# MAYBE I could turn this replace into a standard div
# and remove the div removal below... just an idea.
# For the moment, I'll just import the offending note by hand,
# but if you have lots of notes with attached images, this code
# still doesn't handle it
content = fp.readline().replace('<div class="content">', '')
content = content.replace('<ul class="list">', '')
for line in fp:
line = line.strip()
if line == '</div></body></html>' or line.startswith('<div class="chips">'):
break
content += line + '\n'
content = content.replace('<br>', '<br/>')
content = content.replace('\n', '\0')
while True:
m = r1.search(content)
if not m:
break
content = content[:m.start()] + '<en-todo checked="true"/>' + m.group(1) + '<br/>' + content[m.end():]
while True:
m = r2.search(content)
if not m:
break
content = content[:m.start()] + '<en-todo checked="false"/>' + m.group(1) + '<br/>' + content[m.end():]
content = content.replace('\0', '\n')
# remove final div close
content = content.strip()
if content.endswith('</div>'):
content = content[:-6]
# remove list close (if it was a list)
if content.endswith('</ul>'):
content = content[:-5]
# line might still has chips
if line.startswith('<div class="chips">'):
content += line + '\n'
for line in fp:
line = line.strip()
if line == '</div></body></html>':
break
content += line + '\n'
m = r3.search(content)
if m:
content = content[:m.start()] + content[m.end():]
tags = '<tag>' + m.group(1) + '</tag>'
content = re.sub(
r'class="[^"]*"',
'',
content
)
fp.close()
f.write('''
<note>
<title>{title}</title>
<content><![CDATA[<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">{content}</en-note>]]></content>
<created>{iso}</created>
<updated>{iso}</updated>
{tags}
<note-attributes>
<latitude>0</latitude>
<longitude>0</longitude>
<source>google-keep</source>
<reminder-order>0</reminder-order>
</note-attributes>
</note>
'''.format(**locals()))
f.write('''<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export3.dtd">
<en-export export-date="20180502T065115Z" application="Evernote/Windows" version="6.x">''')
for arg in sys.argv[1:]:
mungefile(arg)
f.write('''</en-export>''')
f.close()
Allerdings erhalte ich dann wieder
Code: Alles auswählen
C:\keep>keep1.py alt/*.html /*.enex
Traceback (most recent call last):
File "C:\keep\keep1.py", line 135, in <module>
mungefile(arg)
File "C:\keep\keep1.py", line 33, in mungefile
fp = open(fn, 'r')
OSError: [Errno 22] Invalid argument: 'alt/*.html'
Wenn Linux die Lösung ist, setze ich auch gerne eine Distri unter VM auf. Das soll nicht das Problem sein
Naja das macht ja nun die Änderungen zuvor wieder rückgängig - bringt also nix. Angeblich geht das mit der Umlenkung so: https://de.wikibooks.org/wiki/Batch-Pro ... Operatoren#>
Probier es doch mal. Mit dem Skript vorher natürlich.
Probier es doch mal. Mit dem Skript vorher natürlich.
Mal das ganze mit den richtigen Parsern:
Code: Alles auswählen
#!/usr/bin/env python3
import sys
import bs4
import dateutil.parser
from pathlib import Path
from xml.etree import ElementTree as et
def convert_note(filename):
with open(filename) as content:
html = bs4.BeautifulSoup(content)
archived = bool(html.find('span', class_='archived'))
title = html.find('div', class_='title').text
date = html.find('div', class_='heading').text.strip()
date = dateutil.parser.parse(date, dayfirst=True)
en_note = et.Element('en-note', style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;")
items = html.find('div', class_='content').find_all('li', class_='listitem')
for item in items:
checked="true" if 'checked' in item.attrs['class'] else "false"
et.SubElement(en_note, 'en-todo', checked=checked).tail = item.find('span', class_='text').text
chips = html.find('div', class_='chips')
if chips:
tags = chips.find_all('span', class_='chip')
tags = [tag.find('span', class_='label-name').text for tag in tags]
else:
tags = []
note = et.Element('note')
et.SubElement(note, 'title').text = title
et.SubElement(note, 'content').text = et.tostring(en_note, encoding='unicode')
et.SubElement(note, 'created').text = '{:%Y%m%dT%H%M%SZ}'.format(date)
et.SubElement(note, 'updated').text = '{:%Y%m%dT%H%M%SZ}'.format(date)
tags_element = et.SubElement(note, 'tags')
for tag in tags:
et.SubElement(tags_element, 'tag').text = tag
attr = et.SubElement(note, 'note-attributes')
et.SubElement(attr, 'latitude').text = '0'
et.SubElement(attr, 'longitude').text = '0'
et.SubElement(attr, 'source').text = 'google-keep'
et.SubElement(attr, 'reminder-order').text = '0'
return note
def main(argv):
export = et.Element("en-export", {
"export-date": "20180502T065115Z",
"application": "Evernote/Windows",
"version": "6.x"
})
for pattern in argv:
pattern = Path(pattern)
anchor = Path(pattern.anchor)
for filename in anchor.glob(str(pattern.relative_to(anchor)):
export.append(convert_note(filename))
with open("export.enex", "w", encoding="utf8") as output:
output.write('<?xml version="1.0" encoding="UTF-8"?>\n'
'<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export3.dtd">\n')
et.ElementTree(export).write(output, encoding='unicode')
if __name__ == '__main__':
main(sys.argv[1:])