Seite 1 von 2
QRegExp funktioniert nicht wie gewünscht
Verfasst: 13. Juli 2006 14:41
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
Verfasst: 13. Juli 2006 15:16
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"]
Re: QRegExp funktioniert nicht wie gewünscht
Verfasst: 13. Juli 2006 15:52
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();
}
Re: QRegExp funktioniert nicht wie gewünscht
Verfasst: 13. Juli 2006 16:09
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.
Verfasst: 13. Juli 2006 16:42
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.
Verfasst: 13. Juli 2006 18:45
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...
Verfasst: 13. Juli 2006 19:11
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?
Verfasst: 13. Juli 2006 19:52
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");
Verfasst: 13. Juli 2006 19:56
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
Verfasst: 13. Juli 2006 21:09
von Nassian
Das ist klar, dumm bin ich auch nicht ... nicht viel. Die index Datei habe ich zuvor heruntergeladen.
Verfasst: 13. Juli 2006 21:43
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....
Verfasst: 13. Juli 2006 23:02
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.
Verfasst: 13. Juli 2006 23:11
von Christian81
Wenn Du keine RegExp hinbekommst - warum nicht einfach QString::find() benutzen anstatt es noch zig mal umzuwandeln...

Verfasst: 13. Juli 2006 23:32
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
Verfasst: 14. Juli 2006 07:39
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;
}