[C#]Leggere Meta Tag Da Una Pagina HTML

mercoledì 20 giugno 2012 - 16.07
Tag Elenco Tags  C#

HardTekCrash Profilo | Newbie

Ciao a tutti raga, come va?
Sto facendo una applicazione in C# che dovrebbe restituirmi i Meta Tag di una pagina HTML.
Ad esempio vorrei poter inserire in un TextBox il contenuto dentro:
<meta name="Description" content="[CONTENUTO CHE VORREI LEGGERE]">
Sono riuscito in un certo senso utilizzando il Regex Data Split, solo che nel TextBox (ovviamente) mi appare anche tutto il resto del codice html.
Avete qualche idea su come fare?
Grazie mille a tutti, gentilissimi come sempre!
Saluti e buona giornata!

StefanoRicci Profilo | Junior Member

puoi semplicemente parsarlo come un classico nodo XML... in questo modo avresti l'attributo "content" del nodo "meta", e semplicemente lo leggeresti come una stringa....
--------------------------------------

IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Professional Edition

HardTekCrash Profilo | Newbie

Ciao Stefano, è piu' o meno quello che ho fatto, infatti il Meta Tag di cui ho bisogno riesco a leggerlo.
Ho fatto in questo modo:
String meta = (web.Document.GetElementsByTagName("meta")[2]).GetAttribute("content");
Solo che come vedi viene inserito in un Array di stringhe e quindi ho dovuto "cercare" l'index (il 2).
Il discorso è che in questo modo non mi funziona con tutte le pagine web, perchè magari c'è chi lo mette prima e chi lo mette dopo (in poche parole non sarà mai uguale per tutte).
Il meta tag che mi serve è il "Keywords", quindi stavo pensando a una sorta di "ricerca" del tag "Keywords" però non ho idea di come fare.
Hai altri suggerimenti?
Grazie mille per la tua risposta, sei stato gentilissimo

StefanoRicci Profilo | Junior Member

>String meta = (web.Document.GetElementsByTagName("meta")[2]).GetAttribute("content");

dalla funzione "GetElementsByTagName" torna una lista che contiene le varie occorrenze...
se passi questa lista con un for/foreach e ti prendi il nodo di tuo interesse

XmlNodeList elemList = doc.GetElementsByTagName("meta"); for (int i = 0; i < elemList.Count; i++) { string name = elemList[i].Attributes["name"].Value; string content = elemList[i].Attributes["content"].Value; }

ora, il difetto di questo codice è l'assunzione che tutti gli elementi che tornano contengono "name" e "content"... per ovviare al problema puoi fare un ciclo su "elemList[i].Attributes" che ha sua volta è una lista, e cercare quello che vuoi tu
--------------------------------------

IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Professional Edition

HardTekCrash Profilo | Newbie

Ciao Stefano, grazie ancora per la tua disponibilità.
Nel codice però ricevo un errore su questa linea:
XmlNodeList elemList = doc.GetElementsByTagName("meta");

Precisamente su "doc."
Scusami ma non ho mai utilizzato nodi in XML nè ho mai lavorato su pagine html con il C#.
Riesci a spiegarmi meglio quello che vuoi fare?Perchè non ho capito molto bene.

P.S Ho già aggiunto il riferimento a System.XML
Ciao e grazie ancora

StefanoRicci Profilo | Junior Member

inizialmente crei il tuo oggetto XmlDocument, quindi gli dici dove andare a cercarsi i dati da prendere...

per esempio

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

dopo questo viene il codice scritto nel post precedente, che si occupa di recuperare i tuoi nodi di interesse....

dando per assunto un codice di questo genere nel file html

<head> <meta ..../> <meta ..../> <meta ..../> </head>

otterrai come risultato un elenco di 3 "meta" dalla chiamata
XmlNodeList elemList = doc.GetElementsByTagName("meta");

con il ciclo for/foreach, andrai a leggerli uno alla volta... un pò come se leggessi le linee di un file di testo, od i record di un database...

for (int i = 0; i < elemList.Count; i++) { string attrVal = elemList[i].Attributes["attrName"].Value; }

ora "attrVal" contiene il valore dell'attributo che risponde a quel nome preciso.... per esempio il meta che hai citato tu in precedenza, contiene due attributi: "name" e "content"...

per capirci questo è un esempio di risultato

<meta name="contenuto1" content="contenuto2" />

string attr1 = elemList[i].Attributes["name"].Value; // leggi: contenuto1 string attr2 = elemList[i].Attributes["content"].Value; // leggi: contenuto2

detto questo, nel caso tu volessi leggere tutti gli attributi dentro il singolo meta, puoi evitare l'ingresso diretto nella lista tramite keyName

elemList[i].Attributes["attrName"]

e trattare "attributes" come una classica lista da cui leggi tutto il contenuto
--------------------------------------

IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Professional Edition

HardTekCrash Profilo | Newbie

Sei un grande Stefano
Spiegazione P E R F E T T A
Appena ho due minuti ci provo e ti faccio sapere, sei stato gentilissimo mi hai aiutato molto ora ho capito cosa intendevi
Grazie ancora, piu' tardi o domani ci provo e ti faccio sapere.
Buona serata

HardTekCrash Profilo | Newbie

Ciao Stefano, ieri ho provato il codice ma non funziona.
L'applicazione rimane bloccata e devo per forza riavviarla.
Non c'è una soluzione piu' semplice magari basandoci su quello che ho fatto io?
Mi spiego meglio, io ho fatto in questo modo:
1)Leggo il codice HTML della pagina
2)Con lo split mostro il contenuto del meta tag.
L'unico problema è che all'inizio, nel textbox mi esce il contenuto di cui ho bisogno, il problema è che viene mostrato tutto il resto del codice html.
Non si può fare una cosa del tipo non mostrare tutto ciò che viene dopo il contenuto del meta tag?
Grazie ancora

StefanoRicci Profilo | Junior Member

riesci a girare il sorgente che stai usando, in modo da capire meglio cosa stai facendo?
--------------------------------------

IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Professional Edition

HardTekCrash Profilo | Newbie

Ciao Stefano, grazie ancora per la tua disponibilità
Allora il codice che ho scritto è questo:
Ho inserito un controllo WebBrowser, questo è il codice:

System.Windows.Forms.WebBrowser web = new System.Windows.Forms.WebBrowser(); web.ScrollBarsEnabled = false; web.ScriptErrorsSuppressed = true; web.Navigate("http://www.sito.it"); while (web.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents(); String meta = (web.Document.GetElementsByTagName("meta")[2]).GetAttribute("content"); string[] keywords = meta.Split(',');

Facendo così tutti i "meta" vanno a finire in un array di stringhe (il problema che mi scrive tutto il resto dell'HTML l'ho risolto così) e quindi devo andarmi a cercare in che indice si trova il tag di mio interesse.
Dal momento che ogni sito web può variare la disposizione dei tag, non a tutti quindi l'indice sarà lo stesso.
In questo caso il tag di mio interesse si trova nell'indice 2 ("meta")[2], come posso fare per visualizzare solamente il tag KEYWORDS?
Avevo pensato di passare tutti i valori di stringhe e poi con un IF cercare il tag KEYWORDS però non riesco.
Tu hai qualche idea?
Grazie mille, buona giornata

InsettoScoppiettato Profilo | Junior Member

Ti passo la classe finita WForm.
ciao

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

e sostituisci questo al progetto designer che ti genera VS in automatico, in modoc he anche i controlli siano posizionati bene nel form.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Spero di averti aiutato
ciao

Alessandro Parma

StefanoRicci Profilo | Junior Member

per ora non posso risponderti, butto un occhio questa sera
--------------------------------------

IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Professional Edition

HardTekCrash Profilo | Newbie

Grazie Stefano, vai tranquillo è un progettino per me non è niente di importante!
Ti ringrazio, sei veramente gentilissimo!

Insetto, ora provo il tuo codice, grazie mille!!!

HardTekCrash Profilo | Newbie

Insetto ti ringrazio, funziona alla perfezione però il problema rimane.
Il tuo codice praticamente cerca tutti i meta tag e li elenca uno per volta, a me serve invece che legga solo il meta tag "Keywords" :-(
Sto provando con il tuo codice a vedere se riesco a far elencare solo il tag KeyWords, se hai altre idee dimmi pure!
Grazie molte, prima o poi questa disavventurà dovrà avere fine hehe :)

InsettoScoppiettato Profilo | Junior Member

belandi pensavo che fosse sufficiente per darti l'idea, e comunque non era ancora chiaro che non cercavi il tag keywords ( che in realtà non esiste!) ma il tag meta il cui name è keyworkds!

Ecco il nuovo codicillo fresco fresco...

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

e il nuovo designer code...

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Dovrebbe essere tutto ora, ciao
Marcare concluso se va tutto bene, grasssie

HardTekCrash Profilo | Newbie

Sei Grande Insetto!!!!
Funziona è proprio quello che cercavo!!!
Grazie 1000!!! :-)
Un ultima cosa...che significa BELANDI? hahahaha
Accetto la tua risposta.
Grazie anche a Stefano che mi ha sopportato tutto questo tempo

HardTekCrash Profilo | Newbie

Ho adattato al codice la funzione che va a prendere solo il meta tag chiamato Keywords e funziona perfettamente!!!!
Grazie ancora ;)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5