HTML-Code von Webseiten automatisiert mit Internet Explorer speichern

Hin und wieder möchte man für den einen oder anderen Zweck den HTML-Code von Webseiten abspeichern. Sicher könnte man hierfür den Quellcode jeder einzelnen Seite mit dem Webbrowser anzeigen und den Inhalt in eine separate Datei abspeichern – oder noch einfacher im Menü "Speichern" aufrufen.

Praktischer ist es aber, insbesondere für viele URLs/Webseiten, es automatisiert von Python erledigen zu lassen. Das folgende Python Script automatisiert den Microsoft Internet Explorer und holt vollautomatisch den Quellcode einer angegebenen URL:

 # This example need ActivePython or any other Python distribution # with the Pywin32 module from Marc Hammond from win32com.client import Dispatch from time import sleep def download_url(url):     """     Note: IE internally formats all HTML to stupid mixed-case, no-     quotes-around-attributes syntax. So if you are planning to parse     the data, make sure you study the output of this function rather     than looking at View-source alone.     """     ie = Dispatch("InternetExplorer.Application")     ie.Visible = 1      ie.Navigate(url)     #it takes a little while for page to load     if ie.Busy:     sleep(2)     #now, we got the page loaded and DOM is filled up - so get the text     text = ie.Document.body.innerHTML     #text is in unicode, so get it into a string     text = unicode(text)     text = text.encode('ascii','ignore')     print text     ie.Quit()     return text  download_url('http://www.heise.de')

Statt „print text“ könnte man an der Stelle gleich den Inhalt in eine Datei schreiben.

Aus Internet Explorer automatisiert drucken

 # IE COM Example # print without prompting the user with printer dialog  from win32com.client.gencache import EnsureDispatch from time import sleep import win32com ie = EnsureDispatch("InternetExplorer.Application") ie.Visible = 1 ie.Navigate("http://www.heise.de") if ie.Busy:  sleep(2) # print the current IE document without prompting the user for the printer dialog  ie.ExecWB(win32com.client.constants.OLECMDID_PRINT, \     win32com.client.constants.OLECMDEXECOPT_DONTPROMPTUSER) 

PDF Dokumente stempeln mit PyPDF

Dieses Python Beispiel Script stempelt die erste Seite eines PDF Dokuments mit einer anderen PDF Datei und schreibt das Resultat in eine dritte PDF Datei. Der Stempelvorgang wird durch Überlagerung zweier PDF Dokumente erzeugt.

Achtung: Das Script benötigt das Python Modul PyPDF.

Tipp: Falls der Stempel durchsichtig aufgetragen werden soll, muss der Text der Stempel-PDF-Datei transparent erzeugt worden sein. Die Transparenz kann man in Word z.B. über die Formatierung/Eigenschaften eines Textfelds definieren-bevor der Stempel zu PDF konvertiert und mit diesem Script verwendet wird.

from pyPdf import PdfFileWriter, PdfFileReader

output = PdfFileWriter()
input1 = PdfFileReader(file("C:\\test.pdf", "rb"))

# add page 1 from input1 to output document, unchanged
output.addPage(input1.getPage(0))

# add page 4 from input1, but first add a watermark from another pdf:
page0 = input1.getPage(0)
watermark = PdfFileReader(file("c:\\stamp.pdf", "rb"))
page0.mergePage(watermark.getPage(0))
output.addPage(page0)

outputStream = file("c:\\document-output.pdf", "wb")
output.write(outputStream)
outputStream.close()

PDF zusammenführen/verbinden mit PyPdf

Dieses PyPDF-Beispiel demonstriert, wie zwei PDF Dokumente in einer dritten PDF-Datei zusammengeführt (konkateniert) werden:

 from pyPdf import PdfFileWriter, PdfFileReader  output = PdfFileWriter() input1 = PdfFileReader(file("C:\\test2.pdf", "rb")) input2 = PdfFileReader(file("C:\\GEHEIM2.pdf", "rb"))   for page in range(input1.getNumPages()):     output.addPage(input1.getPage(page))     print 'Added page %s from first file'%page  for page in range(input2.getNumPages()):     output.addPage(input2.getPage(page))     print 'Added page %s from second file'%page      outputStream = file("c:\\document-output.pdf", "wb") output.write(outputStream) outputStream.close()

Hyperlinks aus Visio extrahieren mit Python

Hier ist ein kleines Python-Script, welches alle Hyperlinks aus Microsoft Visio Dokumenten in eine Textdatei extrahiert. Es benötigt Pywin32!

from win32com.client import Dispatch
from sys import argv 
from sys import exit 
if len(argv)<=2:
     print 'This tool extracts all Hyperlinks from Visio Drawings to a file.'
     print '\nUsage: vsdhyperlink.exe  '
     exit() app = Dispatch('Visio.Application')
app.Visible = 0 
visioDoc = app.Documents.Open(argv[1]) 
file = open(argv[2], 'w') 
count = 0 
for page in range(visioDoc.Pages.Count):
     for shape in range(visioDoc.Pages(page+1).Shapes.Count):
         for link in range(visioDoc.Pages(page+1).Shapes.Item(shape+1).Hyperlinks.Count):
             link = visioDoc.Pages.Item(page+1).Shapes.Item(shape+1).Hyperlinks.Item(link).Address
             file.write(link+'\n')
             count += 1
             print link
file.close() 
print 'Written %s URLS to file %s'%(count, argv[2])  
app.Quit()

Hyperlinks aus Excel extrahieren mit Python

Hier ist ein kleines Python-Script, welches alle Hyperlinks aus Microsoft Excel Dokumenten in eine Textdatei extrahiert. Es benötigt Pywin32!

from win32com.client import Dispatch 
from sys import argv 
from sys import exit  
if len(argv)<=2:     
    print 'This tool extracts all Hyperlink addresses from Excel documents to a file..'
    print '\nUsage: xlshyperlink.exe  '     
    exit()
app = Dispatch('Excel.Application') 
app.Visible = 0 
doc = app.Workbooks.Open(argv[1], 0, False, 2) 
file = open(argv[2], 'w') 
count = 0 
for i in range (doc.Worksheets.Count):
     for worksheet in range (doc.Worksheets.Item(i+1).Hyperlinks.Count):
         link = doc.Worksheets.Item(i+1).Hyperlinks.Item(worksheet+1).Address
         file.write(link+'\n')
         print link
         count += 1 
file.close() 
print 'Written %s URLS to file %s'%(count, argv[2]) 
doc.Saved = 1 
app.Quit() 

PDF im Batch mit OpenOffice und Python

Mit Python lässt sich OpenOffice wunderbar zur Konvertierung von Dokumenten im Batch automatisieren. Das folgende Python Script ist ein Office zu PDF Batch Converter, basierend auf der OpenOffice PyUNO API. Es wird am besten mit dem Python Interpreter aus OpenOffice aufgerufen und konvertiert alle Dokumente in einem angegebenen Verzeichnis zu PDF.

Vorraussetzung ist nat&uuml;rlich, dass die PyUNO API bei der OpenOffice-Installation mitinstalliert und OpenOffice Im Servermodus gestartet wurde:

soffice "-accept=socket,host=localhost,port=2002;urp;"

Und hier ein beispielhafter Aufruf des Programms:

c:\\programme\\OpenOffice\\program\\python.bat c:\\converter\\ooconvert.py c:\\testdocs\\doc

Und nun der Python Quellcode:

 
# For a list of possible export formats see 
# http://www.openoffice.org/files/documents/25/111/filter_description.html 
# or 
# /opt/OpenOffice.org/share/registry/data/org/openoffice/Office/TypeDetection.xcu  

import sys, os, uno 
from com.sun.star.beans import PropertyValue  
export_format="writer_pdf_Export" 
export_extension="pdf"  
def usage():
     print """Usage: %s in_dir out_dir All files in in_dir will be opened with OpenOffice.org and saved to out_dir You must start OpenOffice with this line before starting this script:   soffice "-accept=socket,host=localhost,port=2002;urp;"     """ % (os.path.basename(sys.argv[0]))  
def do_file(file, desktop, out_url):
     # Load File
     file=os.path.abspath(file)
     url="file:///%s" % file
     properties=[]
     p=PropertyValue()
     p.Name="Hidden"
     p.Value=True
     properties.append(p)
     doc=desktop.loadComponentFromURL(
         url, "_blank", 0, tuple(properties));
     if not doc:
         print "Failed to open '%s'" % file
         return
     # Save File
     properties=[]
     p=PropertyValue()
     p.Name="Overwrite"
     p.Value=True
     properties.append(p)
     p=PropertyValue()
     p.Name="FilterName"
     p.Value=export_format
     properties.append(p)
     p=PropertyValue()
     p.Name="Hidden"
     p.Value=True
     basename=os.path.basename(file)
     idx=basename.rfind(".")
     assert(idx!=-1)
     basename=basename[:idx]
     url_save="%s/%s.%s" % (out_url, basename, export_extension)
     try:
         doc.storeToURL(
             url_save, tuple(properties))
     except:
         print "Failed while writing: '%s'" % file
     doc.dispose()
 def main():
     if len(sys.argv)!=3:
         usage()
         sys.exit(1)
     in_dir=sys.argv[1]
     out_dir=sys.argv[2]
     out_url="file://%s" % os.path.abspath(out_dir)
     print out_url
     # Init: Connect to running soffice process
     context = uno.getComponentContext()
     resolver=context.ServiceManager.createInstanceWithContext(
         "com.sun.star.bridge.UnoUrlResolver", context)
     try:
         ctx = resolver.resolve(
             "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
     except:
         print "Could not connect to running openoffice."
         usage()
         sys.exit()
      smgr=ctx.ServiceManager
     desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop",ctx)
     files=os.listdir(in_dir)
     files.sort()
      for file in files:
         print "Processing %s" % file
         file=os.path.join(in_dir, file)
         do_file(file, desktop, out_url)
  if __name__=="__main__":
     main()

PDF zu Text mit PyPDF

Ein PyPDF-Python-Script zum Export des Inhalts einer PDF-Datei im Textformat.

import pyPdf  
def getPDFContent(path):
     content = ""
     pdf = pyPdf.PdfFileReader(file(path, "rb"))
     for i in range(0, pdf.getNumPages()):
         content += pdf.getPage(i).extractText() + "\n"     # Loesche Leerzeichen
     content = " ".join(content.replace("\xa0", " ").strip().split())
     return content
print getPDFContent("test.pdf")

Windows-Benutzer automatisiert mit Python anlegen

Ein Python-Script zum automatisierten Anlegen von Windows-Benutzern:

 
import win32netcon, win32net 
d={}
d['name'] = "PythonTestUser" 
d['password'] = "Top Secret" 
d['comment'] = "A user created by some Python demo code" 
d['flags'] = win32netcon.UF_NORMAL_ACCOUNT | win32netcon.UF_SCRIPT 
d['priv'] = win32netcon.USER_PRIV_USER 
win32net.NetUserAdd(None, 1, d)