Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Gipple
    Registrato dal
    Mar 2009
    Messaggi
    41

    [C#] Trovare link all'interno di codice Javascript

    Buona Domenica a tutti,
    Allora ho una domanda probabilmente stupida da porvi, ma sono alle prime armi col C# e in due giorni non ho cavato un ragno dal buco.
    Sto realizzando un progettino per mio conto (avevo iniziato a scriverlo in Java, ma poi ho deciso di passare al C#, così da impararlo mentre lo realizzo ... forse ) comunque, sostanzialmente io ho necessità di leggere il codice HTML di una pagina internet e di andarmi a cercare una serie di link (non tutti, solo alcuni posti all'interno di codice Javascript) e di salvarli altrove.
    Tralasciando che, al momento, non mi interessi il salvataggio (una cosa per volta ) io avevo pensato di "leggere" la pagina in questo modo (path è una variabile che contiene l'indirizzo della pagina da leggere):

    codice:
    WebClient client = new WebClient(); 
    string dwnString = client.DownloadString(path);
    e di utilizzare delle espressioni regolari per estrarre i link, utilizzando una cosa del genere:

    codice:
    string regL = "<h1 class=\"no\"><a href=\"(.*?)\">";
    Match m = Regex.Match(dwnString,regL);
    Ho tralasciato per il momento che comunque io avrei più di un Match, ma per testare la bontà del codice al momento mi basta che mi vada a pescare il primo dei link che mi interessa ...
    Problema (di cui mi sono reso conto mentre scrivevo l'espressione, ma non ho trovato nulla in merito online ... e io nelle espressioni regolari riesco a perdermi sempre ... ) così il codice mi prende il link E il codice Javascript che lo contorna, come posso fare per dirgli di prendere SOLO ciò che è racchiuso all'interno del codice Javascript? Secondariamente, esistono metodi migliori per fare ciò?
    Grazie in anticipo a tutti, ciao!

  2. #2
    Credo che le regular expression siano il metodo migliore per la tua esigenza. Si tratta solo di definire meglio il pattern, se posti qualche esempio pratico preso dal codice html della tua pagina forse qualcuno riesce a darti una mano.
    Chi non cerca trova.

  3. #3
    Utente di HTML.it L'avatar di Gipple
    Registrato dal
    Mar 2009
    Messaggi
    41
    Innanzitutto grazie per la risposta, in ogni caso devo rettificare il titolo (e parte della descrizione) della domanda poichè mi sono accorto che il codice Javascript c'è, ma solo all'interno dei primi 2-3 che, tra l'altro, non mi interessano ... ma subito ammetto di non averci fatto caso ... in ogni caso questo è un prototipo (dove ho generalizzato i valori, ma è un dettaglio) del codice che devo trovare (del resto non me ne frega un tubo )

    codice:
    [*] Linkname 
    E' un link "base" quindi, niente di particolare.Gli altri link (che non mi interessano) difettano dell'attributo rel o, se ce l'hanno, è diversa la parte precedente. Se è possibile a me verrebbe molto comodo che prendesse e immagazzinasse sia il link che il suo nome contemporaneamente (ma se non si può non mi interessa eccessivamente, vorrà dire che farò un operazione in più) il resto è da cestinare ... il problema è che non ho capito come far si che mi restituisca nel match il link senza tutto il surplus che mi serve per trovarlo (che allo stato attuale elimino utilizzando un paio di replace, metodo però "decisamente poco elegante" (come direbbe un mio ex-professore) e che non mi piace nemmeno un po').

    Ricapitolando il tutto a me servirebbe aiuto per scrivere un espressione regolare che mi cerchi i tag esterni ai link (che sostanzialmente sono è ciò che differenzia i link che mi interessano da quelli che non mi interessano) e me li restituisca senza però restituirmi anche i tag specificati in precedenza. Grazie, ciao!

  4. #4
    Questo esempio funziona, probabilmente però bisognerà tarare meglio la regular expression:
    codice:
    string input = "[*]<a href=\"http://foo/link1.html\" rel=\"1234\" class=\"preview\"> Linkname 1 </a>"
        + "[*]<a href=\"http://foo/link2.html\" class=\"preview\"> Linkname 2 </a>"
        + "[*]<a href=\"http://foo/link3.html\" rel=\"1234\"> Linkname 3 </a>";
    
    Regex rx = new Regex("[*]<a href=\"(?<href>[\\w:/\\.]+)\"( rel=\"([\\w]+)\")?( class=\"([\\w]+)\")?>(?<title>[\\w ]+)</a>");
    
    MatchCollection matches = rx.Matches(input);
    
    foreach (Match match in matches)
    {
        Console.WriteLine("href: {0} --- title: {1}", match.Groups["href"].Value, match.Groups["title"].Value);
    }
    Chi non cerca trova.

  5. #5
    Utente di HTML.it L'avatar di Gipple
    Registrato dal
    Mar 2009
    Messaggi
    41
    Innanzitutto grazie mille per la risposta, però se posso abusare della tua gentilezza volevo farti una domanda ... ammetto di essere abbastanza rincoglionito avendo fatto solo 3 ore di sonno e sarà che le espressioni regolari sono già un mio tallone d'achille normalmente ... ma la simpatica espressione non sembra prendermi i link strutturati in questa maniera (alcuni in effetti sono in realtà così):

    codice:
    [*] Linkname 
    come posso ovviare a tutto ciò? (ho provato a fare un paio di modifiche all'espressione per mio conto ma il risultato rimaneva immutato, se non peggio

    Grazie mille in anticipo e scusa se abuso della tua pazienza
    ciao!

  6. #6
    Devi usare match.Groups["href"].Value per estrarre il valore da href, come nell'esempio.
    Chi non cerca trova.

  7. #7
    Utente di HTML.it L'avatar di Gipple
    Registrato dal
    Mar 2009
    Messaggi
    41
    Si l'ho usato, ma in effetti ho scoperto di aver avuto troppa fretta nello scrivere il post di prima (come al solito) ... difatti ho scoperto che ho "sbagliato" a leggere la "cosa", utilizzando infatti un simpatico programma che permette di testare le espressioni ho scomposto man mano l'espressione e procedendo per blocchi (cosa che dovrei imparare a fare regolarmente ... scrivendo direttamente l'espressione nel codice testandola dopo mi ha sempre fatto più male che bene) ho visto che effettivamente non era quello a dare i problemi ... difatti il problema sta che a causa dell attributo class di quei link non riesce a fare un match.
    Questo perchè (credo) gli stessi link hanno uno spazio dentro l'attributo class che non avevo notato (possibile che mi accorga delle cose solo quando ci sbatto la faccia?), facendo diventare il tutto una cosa del genere:

    codice:
    [*] Linkname 
    provando a tralasciare l'ultima parte (che dovrebbe andarmi a pescare il titolo del link) infatti, il "matcher" mi trova solo "ser" senza preview e quindi, trovandoselo davanti "crede" che la sintassi del link non combaci con l'espressione. Adesso sto sperimentando con lo \s ma non ho grandi risultati per il momento
    In ogni caso grazie ancora per l'assistenza!

    Edit: Ho risolto cambiando l'espressione dentro a class con questo:

    codice:
    [\\w]+\\s[\\w]+
    Non so se è la forma più corretta, ma funziona, questo scoglio l'ho superato Il problema ora è che questi link hanno anche uno o più spazi anche nel titolo (al contrario dell'attributo class che al massimo ha uno spazio) producendo quindi lo stesso problema di prima (siccome non vede la chiusura del tag) ma mi sa che ci penserò dopo pranzo

  8. #8
    Utente di HTML.it L'avatar di Gipple
    Registrato dal
    Mar 2009
    Messaggi
    41
    Niente, ci ho provato un paio di volte ma nulla di fatto ... mantenendo la parte del titolo non trova riscontri ... l'ipotesi che avevo fatto io dello spazio probabilmente è errata perchè ho visto che prima e dopo nella stringa di test usata in locale ci sono ... non riesco proprio a capire ... uff ...
    Come posso dirgli di prendere tutto quello che c'è fra > e < senza badare a cosa effettivamente c'è lì in mezzo?
    Grazie in anticipo, ciao!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.