Domanda

Sto cercando di recuperare del codice HTML da vari blog e ho notato che diversi provider utilizzano lo stesso tag in modi diversi.

Ad esempio, ecco due principali fornitori che utilizzano il tag generatore di meta nomi in modo diverso:

  • Blogger: <meta content='blogger' name='generator'/> (prima il contenuto, poi il nome e, sì, le virgolette singole!)
  • WordPress: <meta name="generator" content="WordPress.com" /> (prima il nome, poi il contenuto)

Esiste un modo per estrarre il valore del contenuto per tutti i casi (virgolette singole/doppie, primo/ultimo della riga)?

PSAnche se sto usando Java, la risposta probabilmente aiuterebbe più persone se si trattasse di espressioni regolari in generale.

È stato utile?

Soluzione

La risposta è: non utilizzare espressioni regolari.

Sul serio.Usa un parser SGML o un parser XML se sai che è un XML valido (probabilmente quasi mai vero).Sbaglierai assolutamente e perderai un sacco di tempo cercando di farlo bene.Basta usare ciò che è già disponibile.

Altri suggerimenti

In realtà, dovresti probabilmente utilizzare una sorta di parser HTML in cui puoi ispezionare ciascun nodo (e quindi gli attributi del nodo) nel DOM della pagina.Non uso nessuno di questi da un po' quindi non conosco i pro e i contro, ma ecco un elenco http://java-source.net/open-source/html-parsers

Queste differenze non sono realmente importanti secondo lo standard XHTML.

In altre parole, sono esattamente la stessa cosa.

Inoltre, se sostituissi le virgolette doppie con le virgolette singole, sarebbe lo stesso.

Il modo tipico di "normalizzare" un documento XML è di ridurlo utilizzando alcune API che trattano il documento come la sua rappresentazione Infoset.Sia le API in stile DOM che SAX funzionano in questo modo.

Se vuoi analizzarli a mano (o con una RegEx) devi replicare tutte queste cose nel tuo codice e, secondo me, non è pratico.

Nota:le virgolette singole (anche senza virgolette, se il valore non contiene uno spazio) sono valide secondo le specifiche HTML del W3C.Citazione:

Per impostazione predefinita, SGML richiede che tutti i valori degli attributi siano delimitati utilizzando virgolette doppie (ASCII decimale 34) o virgolette singole (ASCII decimale 39)...In alcuni casi, gli autori possono specificare il valore di un attributo senza virgolette.

Inoltre, non dimenticare che l'ordine degli attributi può essere invertito e che altri attributi possono apparire nel tag.

Potresti voler dare Java HTMLEditorKit un colpo.È facile sperimentare per vedere se l'analisi fornisce ciò che stai cercando.

Ok, dal momento che stai cercando un linguaggio indipendente, puoi provare un REGEX simile /<meta\s.*content=.*>/ e prendi il risultato da quello e analizza i valori specifici che stai cercando.Non sono affatto un esperto REGEX quindi probabilmente c'è un modo migliore ma usare lo strumento at http://www.codehouse.com/webmaster_tools/regex/ Ho abbinato entrambe le stringhe che hai fornito.

Se devi utilizzare regex, ecco una regex per ottenere solo la parte del contenuto:

content\s*=\s*['"].*?['"]

ritorna

content = "blogger"

E

content='Worpress.com'

rispettivamente.Non sono un esperto di espressioni regolari, ma li ottiene quando vengono forniti i tuoi esempi regexpal.

Una volta ottenuto ciò, puoi ottenere tutto tra virgolette come preferisci, che si tratti di un'altra regex (che è semplicemente immorale a quel punto) o semplicemente di ripetere i caratteri.

Se usi Java potresti voler dare un'occhiata tagzuppa, che è un parser compatibile con SAX per "[analisi] HTML così come si trova in natura".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top