Am scris o mulțime de tutoriale pentru Envato Tuts +. Aceste tutoriale au titluri care trebuie să respecte anumite reguli de capitalizare. Tuts + ne oferă autorilor un instrument bazat pe web care ia textul unei poziții și returnează o rubrică corect capitalizată. Când scriu tutorialele mele, încerc să intru în flux și trecerea la instrumentul de capitalizare îmi întrerupe fluxul. Obișnuiam să-l aterizez și să-l capitalizez eu însumi.
Se pare că am făcut adesea greșeli, ceea ce a cauzat o muncă suplimentară editurilor Tuts + care trebuiau să le corecteze. Fiind un programator, am decis să-mi programez calea din această problemă. Încă îmi scriu propriile titluri, dar când termin, rulau un mic program Python care analizează articolul meu, detectează toate anteturile, apoi le execută prin instrumentul de scriere cu majuscule Tuts + și capitalizează corespunzător toate titlurile.
Întrucât instrumentul de scriere a majusculelor este o aplicație bazată pe web și nu un API, a trebuit să automatizez browser-ul pentru ao invoca și pentru a extrage titlurile capitalizate. În acest tutorial, veți învăța cum să controlați browserul în Python prin Selenium și să îl faceți să liciteze.
Capitalizarea titlurilor nu este știința rachetelor, dar nu este nici banală. Există mai multe stiluri, cu unele suprapuneri și unele variații. Acesta este mai mult sau mai puțin consensul:
Apoi, există o grămadă de excepții și situații speciale (de exemplu, poziția se îndreaptă către linia următoare). Dar totul e în neregulă. Chiar dacă am decis să scriu propriul cod de capitalizare, atunci Tuts + și-a ales deja aroma și trebuie să se conformeze stilului ales.
Instrumentul de scriere a majusculelor Tuts + este un instrument intern destinat a fi folosit numai de către instructorii Tuts +, deci nu pot să-l folosesc ca demo. Cu toate acestea, am găsit un instrument similar numit Case Case Converter. Este o aplicație web cu o zonă de text mare, în care puteți introduce titlul (sau titlul), butonul de conversie pe care faceți clic pentru a trimite formularul, o zonă de ieșire care apare cu o poziție capitalizată corespunzător și, în final, un buton de copiere care copiază a transformat rubrica în clipboard.
O.K. Voi folosi convertorul de caz online, dar nu există niciun API. Aceasta nu este o mare problemă. Pot să automatizez browserul și să simulez un utilizator introducând titlul în câmpul de intrare, făcând clic pe butonul de conversie, așteptând ieșirea să apară, făcând clic pe butonul de copiere și, în final, adăugând titlul corespunzător cu majuscule din clipboard.
Primul pas este să alegeți o automatizare a browserului. Am ales Selenium WebDriver, pe care l-am folosit cu succes inainte. Restul planului este:
Codul sursă complet poate fi găsit pe GitLab.
Seleniul a automatizat browserele începând cu anul 2004. În 2008, acesta a fuzionat cu proiectul WebDriver, care abordează unele dintre limitările seleniului inițial (de ex., Rulează în caseta de nisip JavaScript).
Seleniul oferă încă aroma originală a seleniului numită Selenium RC (Remote Control). Acesta are, de asemenea, un IDE pentru scrierea suitelor de testare automate și un instrument numit Selenium Grid care măsoară Selenium RC pentru suite de test mari care trebuie să ruleze în mai multe medii. Ne vom limita la accesul programabil la browser prin intermediul aplicației WebDriver API (a.k.a. Selenium 2).
Instalarea seleniului este la fel de simplă pipenv seleniu
. Dacă nu sunteți familiarizat cu Pipenv, consultați Revista Python Packaging With Pipenv. De asemenea, aveți nevoie de un driver web specific. Există drivere web pentru diferite browsere și spate. Puteți găsi lista completă pe site-ul Selenium.
Am ales driverul web Chrome pentru acest tutorial. Iată cea mai recentă versiune.
Este un singur fișier zip care conține un singur executabil (există versiuni Windows, MacOS și Linux). Odată ce ați descărcat-o, dezarhivați-o și plasați calea.
Felicitări! Acum sunteți gata să utilizați Selenium WebDriver din Python.
Seleniul face foarte ușor lansarea unui browser. Atâta timp cât aveți driverul web potrivit în calea dvs., pur și simplu importați selenium.webdriver
modul și apelați metoda potrivită pentru a lansa browserul ales:
de la selenium import webdriver driver = webdriver.Chrome ()
Odată ce aveți un obiect driver, puteți apela obține()
pentru a naviga la orice pagină web. Iată cum puteți naviga la convertorul de case de titlu:
driver.get ( 'https://titlecaseconverter.com')
Avem nevoie de o modalitate de a localiza elementele de pe pagina cu care doriți să interacționați. Cea mai simplă cale este să inspectați pagina web din browser și să găsiți ID-urile elementelor țintă. În următorul ecran, puteți vedea că câmpul de introducere are titlul "id":
Butonul de conversie nu are nici un id, dar asta nu este o problemă așa cum veți vedea în curând. Aici este codul pentru a localiza forma și câmpurile de text după id:
input_field = driver.find_element_by_id ('titlu')
Dacă un element cu care doriți să interacționați nu are un id, îl puteți găsi utilizând diferite alte metode, cum ar fi numele, numele clasei sau selectorul CSS. Vedeți toate opțiunile din acest ghid Selenium.
De exemplu, pentru a localiza butonul de conversie, am folosit numele de clasă:
convertButton = \ driver.find_element_by_class_name ('convertButton')
Pentru a popula câmpul de intrare, putem folosi send_keys ()
metoda elementului nostru de câmp de intrare. Dar asigurați-vă că ați șters-o mai întâi. În caz contrar, veți adăuga doar la textul existent.
input_field.clear () input_field.send_keys (titlu)
A fost destul de ușor.
Acum, este timpul să trimiteți formularul. Puteți face acest lucru în două moduri:
a depune()
metodă.Am depus inițial formularul direct:
form = driver.find_element_by_css_selector ('formular') form.submit ()
Din anumite motive, nu funcționează. Nu există nici o eroare, dar nu se întâmplă nimic. Nu am petrecut prea mult timp investigând, pentru că întregul punct al lui Selenium și acest tutorial este de a simula o persoană. Așa că am folosit cealaltă metodă și am făcut clic pe butonul pe care l-am găsit mai devreme:
convertButton.click ()
Convertorul cazului online este oarecum fantezist. Câmpul de ieșire nu există inițial. După ce faceți clic pe butonul de conversie și formularul este trimis, ieșirea este afișată împreună cu butonul de copiere. Asta înseamnă că trebuie să așteptăm până când transmiterea formularului este finalizată înainte de apariția butonului de copiere și îl putem da clic pentru a copia ieșirea în clipboard.
Seleniul te-a acoperit. Are sprijin pentru a aștepta condiții arbitrare și a termina în cazul în care acestea nu se materializează. Iată codul care așteaptă pentru butonul de copiere. Creează o WebDriverWait
obiect cu un timp de așteptare de cinci secunde. Apoi creează o condiție pentru prezența unui element cu numele clasei copyButton
, și apoi numeste obiectul așteptare pana cand()
cu condiția.
așteptați = WebDriverWait (șofer, 5) buttonPresent = presence_of_element_located ((By.CLASS_NAME, 'copyButton')) copyButton = wait.until (butonPresent)
Rezultatul este că, după ce faceți clic pe butonul de conversie, acesta va aștepta până când butonul de copiere apare sau va ieși din timp după cinci secunde. Dacă totul este bine, va reveni copyButton
element.
Puteți citi conținutul câmpurilor de text cu field.get_attribute ( 'valoare')
. Dar, așa cum am menționat mai devreme, convertorul cazului online este cam fantezist. Producția sa este o structură imbricată de deschideri și diviziuni, iar când treceți peste fiecare parte a producției, aceasta vă spune de ce este capitalizată sau nu.
Aș putea să descifrez acest labirint și să analizez poziția reală, dar există o cale mai ușoară. Butonul de copiere copiază poziția cu majuscule în clipboard. Putem să facem clic pe buton și să citim titlul din clipboard. Am folosit modulul clipboard, cu care poți instala pipenv instalează clipboard
. Codul de mai jos șterge clipboard-ul copiind un șir gol în el, dă clic pe butonul de copiere și citește în mod repetat clipboard-ul până când nu este gol.
clipboard.copy () copyButton.click () result = clipboard.paste () în timp ce nu rezultă: time.sleep (0.1) result = clipboard.paste ()
O.K. Putem valorifica o singură poziție. Am pus tot acest cod într-o singură funcție:
Define capitolul: input_field = driver.find_element_by_id ('title') input_field.clear () input_field.send_keys (titlu) #form = driver.find_element_by_css_selector (formular) .pentru_element_by_class_name ('convertButton') convertButton.click () # Așteptați să apară butonul de copiere wait = WebDriverWait (driver, 5) buttonPresent = presence_of_element_located (By.CLASS_NAME, copyButton) clipboardButton = wait.until (clipPent) .copy () copyButton.click () result = clipboard.paste () în timp ce nu rezultă: time.sleep (0.1) result = clipboard.paste () return
Acum, înarmați cu această capacitate, putem analiza un întreg articol și putem valorifica toate titlurile. Îmi scriu tutorialele în Markdown. Toate rubricile mele încep cu una sau mai multe hashes (#).
Am definit o funcție de ajutor care ia o linie și, dacă conține o rubrică, o capitalizează corect folosind capitalize_heading ()
funcția și returnează rezultatul. Principalul lucru este îndepărtarea tuturor hashes-urilor și a spațiilor și restaurarea lor mai târziu. Nu putem alimenta o pozitie cu spatii de conducere, deoarece confunda convertorul casei online:
Definiții: Definiție: Definiție: Definiție: Definiție: Definiție: Definiție: = distanta + capitalize_heading (head.lstrip ()) result = '#'.
În acest moment, putem capitaliza o rubrică Markdown. Este timpul să valorificăm un întreg document Markdown. Acest cod este destul de simplu - iterați peste toate liniile, capitalizați fiecare linie care începe cu un hash și returnați textul corect capitalizat:
def capitalize_all_headings (marcaj)
:capitalized = [] lines = markdown.split ('\ n') pentru linia în linii: if line.startswith ('#'): line = capitalize_line (line) “.join (cu majuscule)
Funcția principală ia un document Markdown de intrare, îl capitalizează și salvează rezultatul ca "capitalized.md", pe care îl puteți verifica și utiliza. Singurul lucru de care trebuie să fii atent este dacă documentul tău Markdown conține linii care nu fac titlu, care încep cu un hash. Acest lucru se poate întâmpla dacă blocați codurile care conțin comentarii Python sau bash.
Fun fact - tutorialul pe care îl citiți chiar acum a fost capitalizat folosind acest program.
Automatizarea browserului vă permite să preluați programatic controlul aplicațiilor web care nu oferă un API. Acest lucru este util cel mai mult pentru completarea formularelor și a altor activități interactive pe Web (făcând clic pe "Următorul" pe termen lung pentru EULA).
Seleniul a fost conceput în primul rând pentru testarea aplicațiilor web, dar este minunat să automatizeze orice interacțiune bazată pe browser. Dacă vă gândiți puțin, puteți găsi probabil multe aplicații web pe care le puteți automatiza și pentru a vă ușura viața.