QRegExp funktioniert nicht wie gewünscht

Alles rund um die Programmierung mit Qt
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

QRegExp funktioniert nicht wie gewünscht

Beitrag von Nassian »

Hallo,

Ich habe ein dringendes Problem: Und zwar muss ich aus einem HTML Dokument, welches in einem QString ist, alle Links bekommen.

Jetzt habe ich mir das so vorgestellt, dass ich die Regular Expression <a href=".?">.?</a> nehme und dann mittels QString().section( QRegExp(), x, y ) nacheinander alle Links herausbekomme. Nur habe ich mich da wohl zu früh gefreut.

Kann mir bitte jemand bei meinem Problem helfen, es ist wirklich dringend.
Danke!

SG Alex
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Was soll section hier? Hast Du " korrekt gequotet?
Ich hätte es so wie im Beispiel gemacht:

Code: Alles auswählen

    QRegExp rx("deine Regexp");
    QString str = "Offsets: 12 14 99 231 7";
    QStringList list;
    int pos = 0;

    while ((pos = rx.indexIn(str, pos)) != -1) {
        list << rx.cap(1);
        pos += rx.matchedLength();
    }
    // list: ["12", "14", "99", "231", "7"]


MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Re: QRegExp funktioniert nicht wie gewünscht

Beitrag von patrik08 »

Nassian hat geschrieben:Hallo,

Ich habe ein dringendes Problem: Und zwar muss ich aus einem HTML Dokument, welches in einem QString ist, alle Links bekommen.
wenn du dass html dokument mit tidy in xhtml umwandelst ... kannst du es mit QXml auslesen alle tag mit attribute posizion einfach alles...

und dazu kann qt gute pdf daraus machen....

&& mit tidy kannst du noch die url validieren... die statische libs lauf auf alle 3 OS und kompiliert sich in 3 minuten...

http://www.qtforum.de/forum/viewtopic.php?t=2216

Code: Alles auswählen

    QDomElement e = n.toElement();
        if( !e.isNull() )
        {
                         if( e.tagName() == "a" ) {
                           e.text()....
                           hasAttributes ()  href /* speichern */
                         }
         n = n.nextSibling();
        } 
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: QRegExp funktioniert nicht wie gewünscht

Beitrag von macman »

Nassian hat geschrieben:Jetzt habe ich mir das so vorgestellt, dass ich die Regular Expression <a href=".?">.?</a> nehme und dann mittels QString().section( QRegExp(), x, y ) nacheinander alle Links herausbekomme.
Die RegExp tut es auch nicht. Ich würde ehr QRegExp("<a href=["\'](.+)["\']>.+</a>") vorschlagen. Für den Rest dann Christians Beispiel folgen. In der Liste hast Du dann schon die reine URL.
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag von Nassian »

Danke für Eure Mühe! Ich habe es gerade mit der neuen Regular expression und dem Code versucht, jedoch bekomme ich immer noch das gesamte HTML Dokument. Was kann ich da nur falsch machen?

Code: Alles auswählen

QFile website( strPagePath );
	if( !website.open( QIODevice::ReadOnly | QIODevice::Text ) ) {
		qCritical() << "[Spider::GetLinkedWebsites( const QString& )] Failed opening" << strPagePath;
		return QStringList();
	}
	
	QString strWebsiteDocument = QString( website.readAll() );
	website.close();
	
	QRegExp expression( "<a href=[\"\'](.+)[\"\']>.+</a>" );
	QStringList linklist;
	int iPosition = 0;
	
	while( (iPosition = expression.indexIn( strWebsiteDocument, iPosition )) != -1 ) {
		linklist << expression.cap( 1 );
		iPosition += expression.matchedLength();
	}
	
	qDebug() << linklist;
	
	return linklist;
@patrik08: Danke für deinen Vorschlag, aber es ist derzeit leider nicht möglich da noch eine externe Library dazuzunehmen.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Nassian hat geschrieben:Dan
@patrik08: Danke für deinen Vorschlag, aber es ist derzeit leider nicht möglich da noch eine externe Library dazuzunehmen.
250 KB dll ? hat kein platz.... du verlierst zeit mit regular expression ...
und mailto: problem ... ecc.. 80% von internet seiten haben html fehler.... tidy putzt alles .... und xml ist cool...
.........................
speack português italiano deutsch english castellà qt
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag von Nassian »

Um den Platz gehts mir nicht (bin selbst static Anhänger :)), aber so wies aussieht werde ich deinen Vorschlag nun doch umsetzen, da es anders wohl nicht funktioniert. Ich danke euch allen vielmals für eure Hilfe!

-edit-
Ich habe gerade tidy installiert und wollte es gleich mal mit der Startseite von heise.de versuchen, allerdings bekomme ich nur Fehler zurück (die Seite ist nicht valid), aber rein gemacht wird sie nicht. Kannst du mir mit der Benützung des Programms vllt. helfen?
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Nassian hat geschrieben:Um den Platz gehts mir nicht (bin selbst static Anhänger :)), aber so wies aussieht werde ich deinen Vorschlag nun doch umsetzen, da es anders wohl nicht funktioniert. Ich danke euch allen vielmals für eure Hilfe!

-edit-
Ich habe gerade tidy installiert und wollte es gleich mal mit der Startseite von heise.de versuchen, allerdings bekomme ich nur Fehler zurück (die Seite ist nicht valid), aber rein gemacht wird sie nicht. Kannst du mir mit der Benützung des Programms vllt. helfen?
mit subversion hast du alles .....

svn co http://ciz.ch/svnciz/_STATIC_LIBS_QT4/lib_tidy_src/ tidylib

Machst einen configurazions file als funktion ....

dass dir immer ein config file schriebt .....
eigentlich alles auf http://qtforum.de/forum/viewtopic.php?t=2216 beschrieben...

QTidy corrww; /* class starten */
corrww.SetUp_xhtml(); /* funktion die dass xhtml setz und dass config schreibet */
corrww.CleanTidy(TIDY_IN,BROWSER_PAGE_1);

dass html in TIDY_IN schreiben und dass resultat bekommst du in BROWSER_PAGE_1
was bereist mit QDomDocument lesen kannst ... alle a tag die http:// enthalten oder wie es du willst....

wichtig ascii ist prima mit QDomDocument ...
manipulation von xml habe ich auch wass in http://qtforum.de/forum/viewtopic.php?t=2350 geschrieben....

Code: Alles auswählen

    tidiconfigfile.append("output-xhtml: yes");
    tidiconfigfile.append("clean: yes");
    tidiconfigfile.append("wrap: 550");
    tidiconfigfile.append("indent-spaces: 1");
    tidiconfigfile.append("char-encoding: ascii");
    tidiconfigfile.append("output-encoding: ascii");
    tidiconfigfile.append("wrap-attributes: yes");
    tidiconfigfile.append("doctype: no");
    tidiconfigfile.append("hide-comments: yes");
    tidiconfigfile.append("numeric-entities: yes");
    tidiconfigfile.append("drop-proprietary-attributes: no");
    tidiconfigfile.append("word-2000: yes"); 
.........................
speack português italiano deutsch english castellà qt
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Nassian hat geschrieben:tartseite von heise.de versuchen, allerdings bekomme ich nur Fehler zurück (die Seite ist nicht valid), aber rein gemacht wird sie nicht. Kannst du mir mit der Benützung des Programms vllt. helfen?

wie host du die seite von www.heise.de ? ... tidy ist nicht ein browser der dateien holt! .....
zuerst musst du via QHttp; dass file holen.....

wget class alles qt...

http://qtforum.de/forum/viewtopic.php?t=2269
.........................
speack português italiano deutsch english castellà qt
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag von Nassian »

Das ist klar, dumm bin ich auch nicht ... nicht viel. Die index Datei habe ich zuvor heruntergeladen.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Na also ....
class qtidy ...
http://ciz.ch/svnciz/cms_qt4/_current_l ... /qtidy.cpp
http://ciz.ch/svnciz/cms_qt4/_current_l ... le/qtidy.h

und irgendwo in deinen configurationsfile gibst ....

Code: Alles auswählen

#define TIDY_CONF \
              QString( "%1tidy.conf" ).arg( WORK_CACHEDIR )


QTidy jobclean;
jobclean.SetUp_xhtml();
jobclean.CleanTidy("index.html","resultat.html");

und qxml kann dass file lesen....

IMO:
Um die dateien zu holen brauche ich libcurl http://curl.haxx.se/ da QHttp keine cookie akteptiert.... und keine redirect ....
http://ciz.ch/svnciz/cms_qt4/_current_l ... /qcurl.cpp
http://ciz.ch/svnciz/cms_qt4/_current_l ... le/qcurl.h
aber sicher musst du einfache seiten laden ohne pass und HTTP_POST somit ist QHttp voll genug....
.........................
speack português italiano deutsch english castellà qt
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag von Nassian »

Vielen Dank für den Code.
Ich werde mich auch mal daran setzen und eine Klasse dafür schreiben und meine Ergebnisse hier posten.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn Du keine RegExp hinbekommst - warum nicht einfach QString::find() benutzen anstatt es noch zig mal umzuwandeln... :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

IMO: nachste woche muss ich ein programm anfangen dass rss und homepage news automatisch holen kann ( wie http://calcionotizie.com/ php5 script ... alle 20 minuten news ueber fussball. neue von ueberall ....)...

und habe bereit das erste setup gemacht ... die console version lauft bereits gut....
# netless url1 url2 url3 unsw.
holt die url und macht ein gueltiges xml file daraus .... dass man mit QDomDocument auslesen kann...

svn co http://ciz.ch/svnciz/net_less/ netless
.........................
speack português italiano deutsch english castellà qt
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Nassian hat geschrieben:Danke für Eure Mühe! Ich habe es gerade mit der neuen Regular expression und dem Code versucht, jedoch bekomme ich immer noch das gesamte HTML Dokument. Was kann ich da nur falsch machen?
Ein Fehler, den ich auch immer mache :-) Man sollte bei QRegExp die Gier abstellen, also setMinimal(true). Ausserdem war die RegExp von mir nicht korrekt, da sie zusätzliche Attribute von Links nicht berücksichtigte. Hiermit klappt es dann allerdings, ohne Frickeleien mit Tidy.

Code: Alles auswählen

#include <QtGui>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);

	QFile website( "News.htm" );
	if( !website.open( QIODevice::ReadOnly | QIODevice::Text ) ) 
	{
		qCritical() << "[Spider::GetLinkedWebsites( const QString& )] Failed opening";
	}

	QString strWebsiteDocument = QString( website.readAll() );
	website.close();

	QRegExp expression( "<a href=["\'](.*)["\']" );
	expression.setMinimal(true);
	QStringList linklist;
	int iPosition = 0;

	while( (iPosition = expression.indexIn( strWebsiteDocument, iPosition )) != -1 ) {
		linklist << expression.cap( 1 );
		iPosition += expression.matchedLength();
	}

	qDebug() << linklist;

	return 0;
}
Antworten