Dal blog di accedere analisi e ottimizzazione dei motori di ricerca (SEO) le persone sono alla ricerca di script che possono analizzare le pagine web e feed RSS da altri siti – per vedere dove il loro traffico proviene tra l’altro.
Parsing dell’HTML proprio dovrebbe essere un problema – supponendo che si utilizza la formattazione coerente – ma una volta impostate le vostre viste al parsing del codice HTML di altre persone la frustrazione che veramente in questa pagina presenta alcune espressioni regolari e un commento che, si spera, si punta a destra direzione.
1. Caso più semplice
Cominciamo con il caso più semplice – un legame ben formattati senza attributi extra:
/
Questo, che ci crediate o no, è un’espressione molto semplice regolare (o “regexp” in breve). Può essere così ripartiti:
- inizia con: <a href = “
- una serie di caratteri fino a, ma non compresi, il prossimo virgolette (“) – 1 ° catturare
- la stringa: “>
- una serie di caratteri – la cattura 2
- termina con: </ a>
Stiamo anche utilizzando due ‘modificatori pattern’:
- i – le partite sono ‘senza bossolo’ (maiuscolo o minuscolo non importa)
- U – le partite sono ‘ungreedy’
La prima caratteristica significa che siamo di corrispondenza Il modificatore ‘ungreedy’ è necessaria perché altrimenti la seconda stringa catturata potrebbe (essendo ‘avidi’) si estendono dal contenuto di un collegamento fino alla fine di un altro collegamento.
Una lacuna di questa regexp è che non corrisponderanno tag link che includono una interruzione di linea – per fortuna c’è un modificatore per questo anche:
/
Ora la ‘.’ personaggio corrisponde ad alcun carattere compreso interruzioni di riga. Abbiamo cambiato anche il primo spazio per digitare un carattere ‘spazio bianco’ in modo che possa corrispondere una pausa spazio, tabulazione o una linea. E ‘necessario avere una sorta di spazio bianco in quella posizione in modo da non corrispondono altro tag come <area> .
Per ulteriori informazioni sul modello modificatori di vedere il link in fondo a questa pagina.
2. Camera per gli attributi extra
Tag più collegamento contengono molto di più di un semplice href attributo. Altri attributi comuni comprendono: rel, target e titolo. Possono comparire prima o dopo l’attributo href:
/
Abbiamo aggiunto i modelli extra prima e dopo l’attributo href. Saranno corrisponde ad alcuna serie di caratteri non contiene il > simbolo. E ‘sempre meglio quando si scrivono le espressioni regolari per specificareesattamente quali caratteri sono ammessi e non ammessi – 0rather che utilizzando il carattere jolly (‘.’).
3. Consentire Quotes mancante
Fino ad ora abbiamo assunto che l’indirizzo del collegamento sta per essere racchiuso tra virgolette doppie.Purtroppo non c’è niente di far rispettare questo modo un sacco di gente semplicemente lasciare fuori. Il problema è che siamo stati affidamento su le quotazioni di essere lì per indicare l’indirizzo dove inizia efinisce. Senza le virgolette che abbiamo un problema.
Sarebbe abbastanza semplice (anche banali) per scrivere un secondo regexp, ma dove sta il divertimento che quando possiamo fare tutto con un:
/
Che cosa posso dire? Le espressioni regolari sono un sacco di divertimento a lavorare con, ma quando ci vuole mezz’ora per capire dove mettere un extra ? tuo davvero so che sei nel profondo.
In primo luogo, quello che con quelle in più ? ‘s?
Perché abbiamo usato l’ U modificatore, tutti i pattern di default di regexp ‘ungreedy’. L’aggiunta di un extra ?dopo un ? o * inverte che il comportamento torna a ‘golosi’, ma solo per il modello precedente. Senza questo, per ragioni che sono difficili da spiegare, l’espressione non riesce. Fondamentalmente seguenti nulla href = è concentrati nel [^>]* espressione.
Abbiamo aggiunto un extra per catturare l’espressione regolare che corrisponde a un doppio preventivo se è lì: ( "?) Vi è poi un backreference. 1 che corrisponde alla chiusura virgolette – se ci fosse un’apertura uno.
Per soddisfare per i collegamenti senza virgolette, il modello per abbinare l’indirizzo del collegamento stesso è stato cambiato da [^ "] * a [^ ">] *? . Ciò significa che il link può essere terminato da non solo una doppia citazione (il comportamento precedente), ma anche uno spazio o un > simbolo. Ciò significa che i collegamenti con indirizzi che contengono escape spazi non saranno più catturato .
4. Raffinazione del Regexp
Data la natura del WWW ci sono sempre sta per essere casi in cui l’espressione regolare si rompe. Piccole modifiche ai modelli in grado di risolvere questi.
gli spazi intorno alla = dopo href:
/
corrispondenza solo i collegamenti a partire da http:
/
apici che racchiudono l’indirizzo link:
/
E sì, tutte queste modifiche possono essere utilizzate allo stesso tempo di fare una super-regexp, ma il risultato è troppo dolorosa da guardare così lascio come esercizio.
Nota: Tutte le espressioni in questa pagina sono stati testati in una certa misura, ma possono verificarsi errori nel trascrivere così si prega di segnalare eventuali errori che può aver trovato in sede di attuazione di questi esempi.
5. Utilizzando l’espressione regolare per analizzare HTML
Utilizzando le impostazioni predefinite per preg_match_all la matrice restituita contiene un array del primo ‘catturare’ poi una serie di cattura secondo e così via. Con l’acquisizione intendiamo modelli contenuti in () :
/ / Codice originale PHP Chirp Internet:. Www.chirp.com.au / / Si prega di confermare l'uso di questo codice, includendo questa intestazione $ url = "http://www.example.net/somepage.html"; $ input = @ file_get_contents ($ url) or die ("Impossibile accedere al file: $ url"); $ regexp = " <as[^>] * href = ( "??)([^ ">] * ?) 1 [^>]*>(.*)< / a> "; if (preg_match_all (" / $ regexp / siu ", $ input, $ matches)) { / / $ matches [2] = serie di indirizzi di collegamento / / $ matches [3] = array di testo del link - compreso il codice HTML }>?
Utilizzando PREG_SET_ORDER ogni link corrispondente ha la sua serie personale nel valore di ritorno:
/ / Codice originale PHP Chirp Internet:. Www.chirp.com.au / / Si prega di confermare l'uso di questo codice, includendo questa intestazione $ url = "http://www.example.net/somepage.html"; $ input = @ file_get_contents ($ url) or die ("Impossibile accedere al file: $ url"); $ regexp = " <as[^>] * href = ( "??)([^ ">] * ?) 1 [^>]*>(.*)< / a> "; if (preg_match_all (" / $ regexp / siu ", $ input, $ matches , PREG_SET_ORDER )) {foreach ($ partite come $ partita) { / / $ incontro [2] = indirizzo del collegamento / / $ incontro [3] = link testuale }}?>
Se trovate qualche caso in cui questo codice cade, fatecelo sapere utilizzando il link commenti qui sotto.
Prima di utilizzare questo script o simili a scaricare pagine da altri siti web, vi suggeriamo di leggere l’articolo relativo a impostare un user agent e l’analisi robots.txt .
6. In primo luogo la verifica robots.txt
Come accennato in precedenza, prima di usare uno script per scaricare i file si deve sempre controllare il file robots.txt . Qui stiamo facendo uso della robots_allowed funzione dal l’articolo linkato sopra per determinare se ci è permesso di accedere ai file:
/ / Codice originale PHP da Internet Chirp:. Www.chirp.com.au / / Si prega di confermare l'uso di questo codice, includendo questa intestazione ini_set ('user_agent', ' NameOfAgent (http://www.example.net) ') ; $ url = "http://www.example.net/somepage.html"; if (robots_allowed ($ url, " NameOfAgent ")) { $ input = @ file_get_contents ($ url) or die ("Impossibile accedere al file : $ url "); $ regexp =" <as[^>] * href = ( "??)([^ ">]*?) 1 [^>]*>(.*) < / a> "; if (preg_match_all (" / $ regexp / siu ", $ input, $ partite, PREG_SET_ORDER)) {foreach ($ $ partite come partita) { / / $ incontro [2] = indirizzo del collegamento / / $ corrispondono [3] link = testo }} } else {die ('Accesso negato da robots.txt');} ?>
Ora siete sulla buona strada per costruire un ragno professionista del web. Se avete intenzione di utilizzare questo, in pratica, si potrebbe desiderare di guardare: la cache del file robots.txt in modo che non è scaricata ogni volta (a Slurp la), controllando gli header dei server e codici di risposta del server , e l’aggiunta di una pausa tra richieste multiple – per cominciare.