PDA

View Full Version : [C++]Eliminare i tag da un file html


limpid-sky
01-04-2009, 19:03
ho un file html dove c'è del testo e delle piccole immagini rappresentati i semi delle carte. Volevo sostituire i link alle immagini con del testo e poi eliminare tutti i tag in eccesso.
Potete indirizzarmi a qualcosa che utilizzi il C++ o qualcosa di già pronto.
Grazie.

wingman87
01-04-2009, 19:39
Il modo migliore è usare le regular expressions, però io le ho usate solo in java, quindi non so in c++ quali sono le librerie migliori.
Per farti un esempio di quello che si può fare con le regex: per togliere tutti i tag basterebbe fare una cosa del tipo:
testo=testo.replace("<.*?>","");

limpid-sky
01-04-2009, 21:00
Il modo migliore è usare le regular expressions, però io le ho usate solo in java, quindi non so in c++ quali sono le librerie migliori.
Per farti un esempio di quello che si può fare con le regex: per togliere tutti i tag basterebbe fare una cosa del tipo:
testo=testo.replace("<.*?>","");

si questo l'ho visto pure in rete.
per fare quello che dico io in c o c++ non so se esiste qualcosa.
a me interessa levare tutti i tag tranne uno quello delle immagini che poi mi volevo sostiutire con una funzione di ricerca e sostituzione sottostringhe.

wingman87
01-04-2009, 21:21
Esistere esiste, se cerchi su google trovi un sacco di librerie però non so consigliarti, aspettiamo che qualcuno che le ha già usate risponda, oppure prova...
Per fare quello che chiedi basta prima sostituire il tag delle immagini con quello che devi e poi tutto quello che resta con il codice che dicevo prima.

fero86
01-04-2009, 21:40
Il modo migliore è usare le regular expressions no, quello é il modo peggiore: il modo migliore é usare il DOM, che é fatto apposta. inoltre per un lavoro del genere sconsiglio il C++, si puó fare in maniera piu semplice.

wingman87
01-04-2009, 22:20
Per quello che deve fare, se ho capito bene, le regex sono meglio.

PS: per evitare ulteriori post inutili e chiarire subito: secondo me il risultato che vuole ottenere limpid-sky non è un'altra pagina html modificata ma un file di testo pulito dai tag. Siccome le immagini nel file di testo non si vedono ma sarebbe bene che ci fosse qualcosa al loro posto vuole sostituirle con qualche testo. Se ho capito male allora sono d'accordo con fero86

fero86
02-04-2009, 11:37
Per quello che deve fare, se ho capito bene, le regex sono meglio.

PS: per evitare ulteriori post inutili e chiarire subito: secondo me il risultato che vuole ottenere limpid-sky non è un'altra pagina html modificata ma un file di testo pulito dai tag. Siccome le immagini nel file di testo non si vedono ma sarebbe bene che ci fosse qualcosa al loro posto vuole sostituirle con qualche testo. Se ho capito male allora sono d'accordo con fero86
l'implementazione Microsoft del DOM non serve solo a costruire da zero documenti XML, serve anche a leggerli da un URL.

ndakota
02-04-2009, 12:12
comunque se non erro per le regex in C++ puoi usare boost..

limpid-sky
02-04-2009, 12:16
Purtroppo credo di non avere le conoscenze necessarie a fare una cosa del genere poichè conosco solo un po di C++.
cmq svelo le mie "carte" il codice html è preso dalla chat del programma di poker gioco digitale. Se il testo viene copiato in un editor html (ho usato ace html... con il tasto destro è presente paste as html)ci sono tanti tag e a me interessata eliminarli tutti tranne i tag delle immagini (i semi delle carte)
Al posto del link all'immagine presente nel codice volevo sostituire del testo come ho scritto in basso.

Ecco il codice di una mano di gioco e quello che vorrei ottenere io.
Se qualcuno mi può dare una mano, per me è difficile ma credo che qualcuno di voi mi sa aiutare.


<SPAN class=dealerbrief channel="dealerbrief" timestamp="1238602104">Benvenuto al tavolo Torneo #5653663, tavolo #1</SPAN><SPAN class=system
channel="system" timestamp="1238602104"><BR>Nuovo livello: 10/20</SPAN><SPAN
class=dealerbrief channel="dealerbrief" timestamp="1238602104"><BR>kapbeer ha la
carta A<IMG align=top src="file:///C:/Documents%20and%20Settings/All%20Users/Dati%20applicazioni/GiocoDigitale/Poker/images/suit_spade.png">
e ha il bottone</SPAN><SPAN class=dealerbrief channel="dealerbrief"
timestamp="1238602104"><BR>Stai giocando Hold 'em</SPAN><SPAN class=dealerbrief
channel="dealerbrief" timestamp="1238602104"><BR>
<HR>
Hold 'em, mano #263884288</SPAN><SPAN class=dealerverbose
channel="dealerverbose" timestamp="1238602104"><BR>enzob mette il piccolo buio
(10)</SPAN><SPAN class=dealerverbose channel="dealerverbose"
timestamp="1238602104"><BR>lucadifour mette il grande buio (20)</SPAN><SPAN
class=dealerverbose channel="dealerverbose" timestamp="1238602104"><BR>cratos76
fa call</SPAN><SPAN class=dealerbrief channel="dealerbrief"
timestamp="1238602104"><BR>domeneque, è il tuo turno</SPAN><SPAN class=player
channel="player" timestamp="1238602104"><BR>Maxplus: <IMG align=top
src="file:///C:/Documents%20and%20Settings/All%20Users/Dati%20applicazioni/GiocoDigitale/Poker/images/emoticon_12.png"></SPAN><SPAN
class=dealerverbose channel="dealerverbose" timestamp="1238602104"><BR>domeneque
fa call</SPAN><SPAN class=dealerverbose channel="dealerverbose"
timestamp="1238602104"><BR>JackRipper fa fold</SPAN><SPAN class=dealerverbose
channel="dealerverbose" timestamp="1238602104"><BR>paolo1962 fa fold</SPAN><SPAN
class=dealerverbose channel="dealerverbose"
timestamp="1238602104"><BR>covodeipirat fa fold</SPAN><SPAN class=dealerverbose
channel="dealerverbose" timestamp="1238602104"><BR>Maxplus fa call</SPAN><SPAN
class=dealerverbose channel="dealerverbose" timestamp="1238602104"><BR>kapbeer
fa call</SPAN><SPAN class=dealerverbose channel="dealerverbose"
timestamp="1238602104"><BR>enzob fa call</SPAN><SPAN class=dealerverbose
channel="dealerverbose" timestamp="1238602104"><BR>lucadifour rilancia di
100</SPAN><SPAN class=dealerverbose channel="dealerverbose"
timestamp="1238602105"><BR>cratos76 fa call</SPAN><SPAN class=dealerverbose
channel="dealerverbose" timestamp="1238602105"><BR>domeneque fa fold</SPAN><SPAN
class=dealerverbose channel="dealerverbose" timestamp="1238602105"><BR>Maxplus
fa call</SPAN><SPAN class=dealerverbose channel="dealerverbose"
timestamp="1238602105"><BR>kapbeer fa call</SPAN><SPAN class=dealerverbose
channel="dealerverbose" timestamp="1238602106"><BR>enzob fa fold</SPAN><SPAN
class=dealerbrief channel="dealerbrief" timestamp="1238602109"><BR>Il flop è
Q<IMG align=top
src="file:///C:/Documents%20and%20Settings/All%20Users/Dati%20applicazioni/GiocoDigitale/Poker/images/suit_club.png">


2<IMG align=top
src="file:///C:/Documents%20and%20Settings/All%20Users/Dati%20applicazioni/GiocoDigitale/Poker/images/suit_diamond.png">
J<IMG align=top
src="file:///C:/Documents%20and%20Settings/All%20Users/Dati%20applicazioni/GiocoDigitale/Poker/images/suit_spade.png"></SPAN><SPAN
class=dealerverbose channel="dealerverbose"
timestamp="1238602115"><BR>lucadifour punta 80</SPAN><SPAN class=dealerverbose
channel="dealerverbose" timestamp="1238602124"><BR>cratos76 fa call</SPAN><SPAN
class=dealerverbose channel="dealerverbose" timestamp="1238602125"><BR>Maxplus
fa call</SPAN><SPAN class=dealerverbose channel="dealerverbose"
timestamp="1238602129"><BR>kapbeer fa call</SPAN><SPAN class=dealerbrief
channel="dealerbrief" timestamp="1238602131"><BR>Il turn è 4<IMG align=top
src="file:///C:/Documents%20and%20Settings/All%20Users/Dati%20applicazioni/GiocoDigitale/Poker/images/suit_spade.png"></SPAN><SPAN
class=dealerverbose channel="dealerverbose"
timestamp="1238602133"><BR>lucadifour fa check</SPAN><SPAN class=dealerverbose
channel="dealerverbose" timestamp="1238602134"><BR>cratos76 fa check</SPAN><SPAN
class=dealerverbose channel="dealerverbose" timestamp="1238602134"><BR>Maxplus
fa check</SPAN><SPAN class=dealerverbose channel="dealerverbose"
timestamp="1238602134"><BR>kapbeer fa check</SPAN><SPAN class=dealerbrief
channel="dealerbrief" timestamp="1238602136"><BR>Il river è 6<IMG align=top
src="file:///C:/Documents%20and%20Settings/All%20Users/Dati%20applicazioni/GiocoDigitale/Poker/images/suit_heart.png"></SPAN><SPAN
class=dealerverbose channel="dealerverbose"
timestamp="1238602138"><BR>lucadifour fa check</SPAN><SPAN class=dealerverbose
channel="dealerverbose" timestamp="1238602140"><BR>cratos76 fa check</SPAN><SPAN
class=dealerverbose channel="dealerverbose" timestamp="1238602140"><BR>Maxplus
fa check</SPAN><SPAN class=dealerverbose channel="dealerverbose"
timestamp="1238602140"><BR>kapbeer fa check</SPAN><SPAN class=dealerbrief
channel="dealerbrief" timestamp="1238602142"><BR>lucadifour ha A<IMG align=top
src="file:///C:/Documents%20and%20Settings/All%20Users/Dati%20applicazioni/GiocoDigitale/Poker/images/suit_club.png">


J<IMG align=top
src="file:///C:/Documents%20and%20Settings/All%20Users/Dati%20applicazioni/GiocoDigitale/Poker/images/suit_diamond.png">
e coppia di jack</SPAN><SPAN class=dealerbrief channel="dealerbrief"
timestamp="1238602145"><BR>Maxplus mostra 2<IMG align=top
src="file:///C:/Documents%20and%20Settings/All%20Users/Dati%20applicazioni/GiocoDigitale/Poker/images/suit_club.png">
8<IMG align=top
src="file:///C:/Documents%20and%20Settings/All%20Users/Dati%20applicazioni/GiocoDigitale/Poker/images/suit_heart.png">
da coppia di due</SPAN><SPAN class=dealerbrief channel="dealerbrief"
timestamp="1238602150"><BR>lucadifour vince 760 con coppia di jack</SPAN><SPAN
class=dealerbrief channel="dealerbrief" timestamp="1238602155"><BR>
<HR>




Benvenuto al tavolo Torneo #5653663, tavolo #1
Nuovo livello: 10/20
kapbeer ha la carta A[picca] e ha il bottone
Stai giocando Hold 'em
Hold 'em, mano #263884288
enzob mette il piccolo buio (10)
lucadifour mette il grande buio (20)
cratos76 fa call
domeneque, è il tuo turno
domeneque fa call
JackRipper fa fold
paolo1962 fa fold
covodeipirat fa fold
Maxplus fa call
kapbeer fa call
enzob fa call
lucadifour rilancia di 100
cratos76 fa call
domeneque fa fold
Maxplus fa call
kapbeer fa call
enzob fa fold
Il flop è Q[fiori] 2[quadri] J[picca]
lucadifour punta 80
cratos76 fa call
Maxplus fa call
kapbeer fa call
Il turn è 4[picca]
lucadifour fa check
cratos76 fa check
Maxplus fa check
kapbeer fa check
Il river è 6[cuori]
lucadifour fa check
cratos76 fa check
Maxplus fa check
kapbeer fa check
lucadifour ha A[fiori] J[picca] e coppia di jack
Maxplus mostra 2[picca] 8[cuori] da coppia di due
lucadifour vince 760 con coppia di jack

wingman87
02-04-2009, 18:26
l'implementazione Microsoft del DOM non serve solo a costruire da zero documenti XML, serve anche a leggerli da un URL.
Non lo nego ma non è quello che stavo dicendo io...

Comunque con le regex fare quello che chiedi non è molto difficile. Però prima di togliere tutti i tag oltre a sostituire le immagini dovresti anche sostituire i <br> con dei ritorni a capo.
Ho fatto una piccola ricerca e confermo quanto detto da ndakota. Qui trovi tutte le info che ti servono LINK (http://www.boost.org/doc/libs/1_38_0/libs/regex/doc/html/index.html).
Per usare il DOM, di nuovo, non so indirizzarti perché non ho mai fatto cose del genere in C++.

Tommo
02-04-2009, 19:10
Non vorrei risultare semplicistico, ma il problema è abbastanza più semplice di quello che sembra :asd:

-Noi sappiamo che il testo che vuoi togliere è compreso tra '<' e '>'.
Tanto basta, e si risolve in un for.



ifstream html( "miofile.html", ios_base::in | ios_base::ate );

//controlla la grandezza.
unsigned int size = html.tellg();
html.seekg (0, ios::beg);

//alloca il buffer
char* buffer = (char*)malloc( size );
html.read (buffer, size );

html.close();

string clean ="";
bool parsingTag = false;

for( unsigned int i = 0; i < size-1; i++)
{
if( buffer[i] == '<' ) //inizia la tag
{
parsingTag = true;
clean += ' ';
}
else if( buffer[i] == '>' ) //fine tag
parsingtag = false;

if( !parsingTag )
clean += buffer[i];
else if( buffer[i] = 'B' && buffer[i+1] == 'R' ) //se la tag è BR bisogna andare accapo.
clean += '\n';
}

free( buffer );



Alla fine di questo codice hai il testo privo di tags dentro alla stringa clean ;)
Si poteva fare in maniera più efficente, per esempio evitando di fare += per ogni char, e serve di aggiungere l'esclusione per le immagini.
Però la base è quella.

Forse prima di appellarsi a regex, boost e altra roba assurda (e dire che il C++ non puo' risolvere questo problema) si dovrebbe avviare il cervello ;)

EDIT: migliorato un pò...

wingman87
02-04-2009, 20:57
Eh, hai ragione anche te, ma abituato a programmare in java certi problemi li vedi in un'altra ottica.

Tommo
02-04-2009, 22:16
Beh in questo caso non è un grosso punto a favore di Java :asd:
Cmq si fa tranquillamente anche in java la stessa cosa.

limpid-sky
03-04-2009, 00:46
Non vorrei risultare semplicistico, ma il problema è abbastanza più semplice di quello che sembra :asd:

-Noi sappiamo che il testo che vuoi togliere è compreso tra '<' e '>'.
Tanto basta, e si risolve in un for.



ifstream html( "miofile.html", ios_base::in | ios_base::ate );

//controlla la grandezza.
unsigned int size = html.tellg();
html.seekg (0, ios::beg);

//alloca il buffer
char* buffer = (char*)malloc( size );
html.read (buffer, size );

html.close();

string clean ="";
bool parsingTag = false;

for( unsigned int i = 0; i < size-1; i++)
{
if( buffer[i] == '<' ) //inizia la tag
{
parsingTag = true;
clean += ' ';
}
else if( buffer[i] == '>' ) //fine tag
parsingtag = false;

if( !parsingTag )
clean += buffer[i];
else if( buffer[i] = 'B' && buffer[i+1] == 'R' ) //se la tag è BR bisogna andare accapo.
clean += '\n';
}

free( buffer );



Alla fine di questo codice hai il testo privo di tags dentro alla stringa clean ;)
Si poteva fare in maniera più efficente, per esempio evitando di fare += per ogni char, e serve di aggiungere l'esclusione per le immagini.
Però la base è quella.

Forse prima di appellarsi a regex, boost e altra roba assurda (e dire che il C++ non puo' risolvere questo problema) si dovrebbe avviare il cervello ;)

EDIT: migliorato un pò...

Grazie molto.
Ho trovato una cosa simile su bruke eckel practical programming, con qualche accorgimento in più. La base cmq è quella come dicevi tu. Questa è più semplice e al mio livello. Poi magari la posto visto che può essere interessante.

wingman87
03-04-2009, 03:39
Beh in questo caso non è un grosso punto a favore di Java :asd:
Cmq si fa tranquillamente anche in java la stessa cosa.
Beh, non è colpa di java in sé, è colpa mia che mi faccio viziare dal framework molto generoso :)