Ich schreibe viele Tutorials für Envato Tuts +. Diese Tutorials enthalten Überschriften, die bestimmten Kapitalisierungsregeln folgen müssen. Tuts + stellt uns Autoren ein webbasiertes Werkzeug zur Verfügung, das den Text einer Überschrift übernimmt und eine richtig großgeschriebene Überschrift zurückgibt. Wenn ich meine Tutorials schreibe, versuche ich, in den Fluss einzusteigen, und der Wechsel zum Aktivierungswerkzeug bricht meinen Fluss. Ich habe es nur geflügelt und mache die Kapitalisierung selbst.
Es stellte sich heraus, dass ich oft Fehler gemacht habe, was den Tuts + -Editoren, die sie korrigieren mussten, zusätzliche Arbeit verursachte. Als Programmierer entschloss ich mich, das Problem zu lösen. Ich schreibe immer noch meine eigenen Überschriften, aber wenn ich fertig bin, führe ich ein kleines Python-Programm aus, das meinen Artikel parst, alle Überschriften erkennt und sie dann mit dem Tuts + -Tool ausführt und alle Überschriften richtig schreibt.
Da es sich bei dem Kapitalisierungswerkzeug um eine webbasierte Anwendung und nicht um eine API handelt, musste ich den Browser automatisieren, um ihn aufzurufen und die großgeschriebenen Überschriften zu extrahieren. In diesem Lernprogramm erfahren Sie, wie Sie den Browser in Python über Selenium steuern und dafür sorgen, dass Ihr Gebot ausgeführt wird.
Das Übertragen von Überschriften ist keine Raketenwissenschaft, aber auch nicht trivial. Es gibt verschiedene Stile mit einigen Überlappungen und einigen Variationen. Dies ist mehr oder weniger der Konsens:
Dann gibt es eine Reihe von Ausnahmen und besonderen Situationen (z. B. Überschriften zur nächsten Zeile). Aber das ist alles eine Frage. Selbst wenn ich mich entschieden habe, meinen eigenen Code für die Kapitalisierung zu schreiben, hat Tuts + bereits seinen Geschmack ausgewählt und ich muss mich an den von ihm gewählten Stil anpassen.
Das Tuts + -Kapitalisierungs-Tool ist ein internes Tool, das nur von Tuts + -Instructoren verwendet werden kann. Daher kann ich es nicht als Demo verwenden. Ich habe jedoch ein ähnliches Tool namens Title Case Converter gefunden. Hierbei handelt es sich um eine Webanwendung mit einem großen Textbereich, in dem Sie die Überschrift (oder den Titel) eingeben können, eine Schaltfläche zum Konvertieren, auf die Sie klicken, um das Formular zu senden, einen Ausgabebereich, der mit einer Überschrift in Großschreibung angezeigt wird, und schließlich eine Schaltfläche zum Kopieren, die das kopiert konvertierte Überschrift in die Zwischenablage.
OK. Ich werde den Online-Fallkonverter verwenden, aber es gibt keine API. Das ist kein großes Problem. Ich kann den Browser automatisieren und einen Benutzer simulieren, der die Überschrift in das Eingabefeld eingibt, auf die Schaltfläche "Konvertieren" klickt, auf die Ausgabe wartet, auf die Schaltfläche "Kopieren" klickt und schließlich die richtig geschriebene Überschrift aus der Zwischenablage einfügt.
Der erste Schritt ist die Auswahl einer Browser-Automatisierung. Ich habe mich für Selenium WebDriver entschieden, das ich bereits erfolgreich eingesetzt habe. Der Rest des Plans ist:
Den vollständigen Quellcode finden Sie auf GitLab.
Seit 2004 automatisiert Selenium Browser. 2008 fusionierte es mit dem WebDriver-Projekt, das einige der Einschränkungen des ursprünglichen Selenium (z. B. Ausführen in der JavaScript-Sandbox) anspricht..
Selen bietet immer noch den ursprünglichen Geschmack von Selen, genannt Selenium RC (Remote Control). Es verfügt auch über eine IDE zum Schreiben automatisierter Testreihen und ein Tool namens Selenium Grid, mit dem Selenium RC für große Testreihen skaliert wird, die in mehreren Umgebungen ausgeführt werden müssen. Wir beschränken uns auf den programmatischen Zugriff auf den Browser über die WebDriver-API (a.k.a. Selenium 2)..
Die Installation von Selenium ist so einfach wie Pipenv-Selen
. Wenn Sie mit Pipenv nicht vertraut sind, sollten Sie sich das Python Packaging With Pipenv von Revisiting ansehen. Sie benötigen auch einen bestimmten Webtreiber. Es gibt Webtreiber für verschiedene Browser und Backends. Die vollständige Liste finden Sie auf der Selenium-Website.
Ich habe den Chrome-Web-Treiber für dieses Tutorial ausgewählt. Hier ist die neueste Version.
Es ist eine einzige ZIP-Datei, die eine einzige ausführbare Datei enthält (es gibt Windows-, MacOS- und Linux-Versionen). Sobald Sie es heruntergeladen haben, entpacken Sie es und lassen Sie es in Ihren Pfad fallen.
Herzliche Glückwünsche! Sie können jetzt Selenium WebDriver von Python verwenden.
Selenium macht es sehr einfach, einen Browser zu starten. Solange Sie den richtigen Web-Treiber in Ihrem Pfad haben, importieren Sie einfach den selen.webdriver
Modul und rufen Sie die richtige Methode auf, um den Browser Ihrer Wahl zu starten:
von Selen import webdriver driver = webdriver.Chrome ()
Sobald Sie ein Treiberobjekt haben, können Sie das aufrufen erhalten()
Methode, um zu einer beliebigen Webseite zu navigieren. So navigieren Sie zum Title Case Converter:
driver.get ('https://titlecaseconverter.com')
Wir brauchen eine Möglichkeit, die Elemente auf der Seite zu finden, mit der Sie interagieren möchten. Der einfachste Weg besteht darin, die Webseite im Browser zu überprüfen und die IDs der Zielelemente zu finden. Im folgenden Screenshot sehen Sie, dass das Eingabefeld die ID "Titel" hat:
Der Konvertierungs-Button hat keine ID, aber das ist kein Problem, wie Sie bald sehen werden. Hier ist der Code, um das Formular und die Textfelder anhand der ID zu finden:
input_field = driver.find_element_by_id ('title')
Wenn ein Element, mit dem Sie interagieren möchten, keine ID hat, können Sie es mit verschiedenen anderen Methoden finden, z. B. name, Klassenname oder CSS-Selektor. Alle Optionen in diesem Selenium-Handbuch.
Um die Konvertierungsschaltfläche zu finden, habe ich beispielsweise ihren Klassennamen verwendet:
convertButton = \ driver.find_element_by_class_name ('convertButton')
Um das Eingabefeld aufzufüllen, können Sie das verwenden send_keys ()
Methode unseres Eingabefeldelements. Stellen Sie jedoch sicher, dass Sie es zuerst löschen. Andernfalls hängen Sie einfach an den vorhandenen Text an.
input_field.clear () input_field.send_keys (Überschrift)
Das war ziemlich einfach.
Nun ist es Zeit, das Formular abzusenden. Sie haben zwei Möglichkeiten:
einreichen()
Methode.Ich habe das Formular zunächst direkt eingereicht:
form = driver.find_element_by_css_selector ('body> form') form.submit ()
Aus irgendeinem Grund funktioniert es nicht. Es ist kein Fehler, aber nichts passiert. Ich habe nicht zu viel Zeit damit verbracht zu recherchieren, weil der Sinn von Selenium und dieses Tutorial darin besteht, eine Person zu simulieren. Also habe ich die andere Methode verwendet und einfach auf die Schaltfläche geklickt, die ich zuvor gefunden hatte:
convertButton.click ()
Der Online-Fallkonverter ist etwas ausgefallen. Das Ausgabefeld existiert anfangs nicht. Nachdem Sie auf die Schaltfläche "Konvertieren" geklickt haben und das Formular gesendet wurde, wird die Ausgabe zusammen mit der Schaltfläche "Kopieren" angezeigt. Das bedeutet, dass wir warten müssen, bis die Formularübermittlung abgeschlossen ist, bevor die Schaltfläche "Kopieren" angezeigt wird. Sie können darauf klicken, um die Ausgabe in die Zwischenablage zu kopieren.
Selen hat dich bedeckt. Es bietet Unterstützung für das Warten auf willkürliche Bedingungen und das Zeitlimit, wenn sie nicht eintreten. Hier ist der Code, der auf die Schaltfläche "Kopieren" wartet. Es schafft eine WebDriverWait
Objekt mit einem Timeout von fünf Sekunden. Anschließend wird eine Bedingung für das Vorhandensein eines Elements mit dem Klassennamen erstellt copyButton
, und dann ruft es das wait-Objekt auf bis um()
Methode mit der Bedingung.
wait = WebDriverWait (Treiber, 5) buttonPresent = Präsenz_des_Elementelements ((By.CLASS_NAME, 'copyButton')) copyButton = wait.until (buttonPresent)
Das Ergebnis ist, dass nach dem Klicken auf die Konvertierungsschaltfläche gewartet wird, bis die Kopierschaltfläche nach fünf Sekunden angezeigt wird oder eine Zeitüberschreitung auftritt. Wenn alles gut ist, wird das zurückgegeben copyButton
Element.
Sie können den Inhalt von Textfeldern mit lesen field.get_attribute ('value')
. Wie ich bereits erwähnt habe, ist der Online-Fallkonverter irgendwie ausgefallen. Die Ausgabe ist eine verschachtelte Struktur aus Bereichen und Divs. Wenn Sie den Mauszeiger über jeden Teil der Ausgabe bewegen, erfahren Sie, warum er groß geschrieben wird oder nicht.
Ich könnte dieses Labyrinth durchdringen und die tatsächliche Überschrift analysieren, aber es gibt einen einfacheren Weg. Die Schaltfläche "Kopieren" kopiert die großgeschriebene Überschrift in die Zwischenablage. Wir können einfach auf die Schaltfläche klicken und die Überschrift aus der Zwischenablage lesen. Ich habe das Zwischenablage-Modul verwendet, mit dem Sie installieren können pipenv Zwischenablage installieren
. Der folgende Code löscht die Zwischenablage, indem er eine leere Zeichenfolge in die Zwischenablage kopiert, auf die Schaltfläche "Kopieren" klickt und die Zwischenablage wiederholt liest, bis sie nicht leer ist.
clipboard.copy (") copyButton.click () result = clipboard.paste (), während nicht result: time.sleep (0.1) result = clipboard.paste ()
OK. Wir können eine einzige Überschrift groß machen. Ich habe den ganzen Code in einer einzigen Funktion zusammengefasst:
def capitalize_heading (heading): input_field = driver.find_element_by_id ('title') input_field.clear () input_field.send_keys (heading) # form = driver.find_element_by_css_selector ('body> form') # form.submit () convertButton = \ driver .find_element_by_class_name ('convertButton') convertButton.click () # Warte auf das Kopieren der Schaltfläche "wait". wait = WebDriverWait (Treiber, 5) buttonPresent = Präsenz_von_element_gebunden ((By.CLASS_NAME, 'copyButton')) copyButton = wait.until (buttonPresent) .copy (") copyButton.click () result = clipboard.paste (), während nicht result: time.sleep (0.1) result = clipboard.paste () liefert das Ergebnis
Mit dieser Fähigkeit können wir nun einen ganzen Artikel analysieren und alle Überschriften groß schreiben. Ich schreibe meine Tutorials in Markdown. Alle meine Überschriften beginnen mit einem oder mehreren Hashwerten (#).
Ich habe eine Hilfsfunktion definiert, die eine Zeile übernimmt und, wenn sie eine Überschrift enthält, diese richtig mit der capitalize_heading ()
Funktion und gibt das Ergebnis zurück. Die Hauptsache ist, alle führenden Hashes und Leerzeichen zu entfernen und sie später wiederherzustellen. Wir können eine Überschrift nicht mit führenden Leerzeichen füttern, da dies den Online-Fallkonverter verwirrt:
def capitalize_line (line): tokens = line.split ('#') heading = tokens [-1] space_count = len (heading) - len (heading.lstrip ()) Abstand = heading [: space_count] tokens [-1] = Abstand + capitalize_heading (heading.lstrip ()) result = '#'. join (Token) gibt das Ergebnis zurück
An diesem Punkt können wir eine Markdown-Überschrift kapitalisieren. Es ist an der Zeit, ein gesamtes Markdown-Dokument groß zu schreiben. Dieser Code ist ziemlich einfach - iteriert über alle Zeilen, macht jede Zeile, die mit einem Hash beginnt, groß und gibt den richtig geschriebenen Text zurück:
def capitalize_all_headings (markdown)
:Großschreibung = [] Zeilen = Markdown.split ('\ n') für Zeile in Zeilen: Wenn Zeile.Startswith ('#'): Zeile = Großbuchstabe (Zeile) print (Zeile) Großschreibung '.join (großgeschrieben)
Die Hauptfunktion nimmt ein Eingabe-Markdown-Dokument, macht es groß und speichert das Ergebnis als "capitalized.md", das Sie überprüfen und verwenden können. Seien Sie nur vorsichtig, wenn Ihr Markdown-Dokument Zeilen ohne Überschrift enthält, die mit einem Hash beginnen. Dies kann passieren, wenn Sie Codeblöcke mit Python- oder Bash-Kommentaren verwenden.
Interessante Tatsache: Das Tutorial, das Sie gerade lesen, wurde mit diesem Programm großgeschrieben.
Durch die Automatisierung des Browsers können Sie programmgesteuert die Kontrolle über Webanwendungen übernehmen, die keine API bieten. Dies ist vor allem für das Ausfüllen von Formularen und andere interaktive Webaktivitäten hilfreich (klicken Sie bei langen EULAs auf "Weiter"?)..
Selenium wurde hauptsächlich für das Testen von Webanwendungen entwickelt, eignet sich jedoch hervorragend für die Automatisierung von Browser-basierter Interaktion. Wenn Sie ein wenig nachdenken, werden Sie wahrscheinlich viele Webanwendungen finden, die Sie automatisieren und Ihr Leben einfacher machen können.