Stavo rispondendo ad alcune domande del quiz per un'intervista, e la domanda riguardava come avrei fatto lo screen scraping. Cioè, prelevare il contenuto da una pagina Web, partendo dal presupposto che non si dispone di un modo meglio strutturato per interrogare direttamente le informazioni (ad esempio un servizio Web).Raschia schermo: espressioni regolari o espressioni XQuery?
La mia soluzione era utilizzare un'espressione XQuery. L'espressione era abbastanza lunga perché il contenuto di cui avevo bisogno era abbastanza profondo nella gerarchia HTML. Ho dovuto cercare tra gli antenati in modo corretto prima di trovare un elemento con un attributo id
. Ad esempio, raschiando una pagina di Amazon.com per Dimensioni del prodotto è simile al seguente:
//a[@id="productDetails"]
/following-sibling::table
//h2[contains(child::text(), "Product Details")]
/following-sibling::div
//li
/b[contains(child::text(), "Product Dimensions:")]
/following-sibling::text()
Questa è un'espressione piuttosto brutta, ma è per questo che Amazon offre un API servizio web. Ad ogni modo, è solo un esempio. La domanda non riguardava Amazon, riguarda lo scraping dello schermo.
All'intervistatore non è piaciuta la mia soluzione. Ha pensato che fosse fragile, perché una modifica al design della pagina di Amazon potrebbe richiedere la riscrittura dell'espressione XQuery. Il debug di un'espressione XQuery che non corrisponde a nulla nella pagina a cui viene applicata è difficile.
io non sono d'accordo con le sue dichiarazioni, ma non pensavo che la sua soluzione era alcun miglioramento: ha pensato che è meglio usare un'espressione regolare , e la ricerca di contenuti e markup vicino al peso di spedizione. Ad esempio, utilizzando Perl:
$html =~ m{<li>\s*<b>\s*Product Dimensions:\s*</b>\s*(.*?)</li>}s;
mio contro-argomentazione era che questo è anche suscettibile di Amazon cambiare il loro codice HTML. Potrebbero compitare i tag HTML in maiuscolo (<LI>
) o aggiungere attributi CSS o modificare a <span>
o modificare l'etichetta "Dimensioni prodotto:" in "Dimensioni:" o molti altri tipi di modifiche. Il mio punto era che le espressioni regolari non risolvono le debolezze che ha chiamato nella mia soluzione XQuery.
Inoltre, le espressioni regolari possono trovare falsi positivi, a meno che non si aggiunga un contesto sufficiente all'espressione. Può anche abbinare involontariamente il contenuto che si trova all'interno di un commento, o una stringa di attributo o una sezione CDATA.
La mia domanda è: quale tecnologia utilizzate per eseguire lo screen scraping? Perché hai scelto quella soluzione? C'è qualche motivo convincente per usarne uno? O non usare mai l'altro? C'è una terza scelta oltre a quelle che ho mostrato sopra?
PS: si supponga per il ragionamento che non vi sia alcuna API del servizio Web o altro modo più diretto per acquisire il contenuto desiderato.
Questa è la ragione principale per evitare il web scraping basato su XML. Nessun processore XML è indulgente come un browser. La pagina deve solo rompere una regola di well-formedness per rendere XQuery completamente inutile. – harpo