Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Qt] Parsowanie dokumentu www
peter13135
post
Post #1





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


Mam taki kodzik :
Kod
    QWebPage page;
    QWebFrame * frame = page.mainFrame();
    frame->setHtml(str);
    QWebElement document = frame->documentElement();
    QWebElementCollection tables = document.findAll(".table");
    int numTables = tables.count();
    qDebug() << numTables;
    return;


Pod zmienną str znajduje się źródło tej strony : http://panoramafirm.pl/szukaj/mazowieckie,...wa/firmy,1.html

Chcę pobrać ilość elementów o klasie table. Niestety program podaje, że tych elementów jest 0. Podczas gdy w rzczywistości jest ich 15.

Gdy zamiast ".table" dam "a", to zwraca mi to 17, czyli jakieś linki znajduje ale chyba jest ich ciut za mało.

W czym może być problem ?

Wszystkie tabelki są w divie o klasie "results" <- tego diva nie mogę pobrać.
Mogę za to pobrać div o nazwię 'socialIcons right" ale nie w całości - na nim program kończy parsowanie.

Ten post edytował peter13135 4.08.2012, 16:07:05
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
peter13135
post
Post #2





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


http://www.sendspace.pl/file/b9a852801bddf23ea604782
Wywaliłem całe gui i inne rzeczy, żebyś nie musiał zbyt wiele szukać (IMG:style_emoticons/default/wink.gif)
edit://
Co tak umilkłeś ? (IMG:style_emoticons/default/tongue.gif) Nie chcesz mi już pomóc ? (IMG:style_emoticons/default/sad.gif)
edit://
Zrobiłem Twoją metodą, tzn nie łąduję za pomocą QNetworkManagera, tylko za pomocą QWebPage i teraz działa. Nie wiem tylko czemu tak wolno. I nadal nie wiem czemu sposób z użyciem setHtml() nie działa.

Pozwolę nieco skomentować Twój wcześniejszy post.
Cytat
1. Następnym razem dołączaj cały kod, nie wróżymy z fusów

Jeśli by problemem miała być asynchrnicznicznie działąjąca klasa (czy o czym tam mówiłeś), to w moim kodzie wyraźnie widać, że od razu po wywołaniu setHtml, "parsuję" cały dokument.
Poza tym, tak się składa, że błąd jest właśnie gdzieś w tym kodzie, który dałem w pierwszym poście.
Cytat
2. Poczytaj o sygnałach, slotach i event driven programming.

Po co ?
Cytat
Wczytaj się w dokumentację samego qt- w pewnym momencie myślałem, że wklejasz html do qLineEdit który ma limit długości(patrz pkt.1)

Jak się ma początek tego zdania, do drugiej części ? Jak się ma moje "wczytywanie w dokumentację Qt" do tego, że myślałeś, że wklejam html do QLineEdit ?
Co zasugerowało, że wklejam html do QLineEdit ? Przecież na podstawie mojego kodu widać bardzo przejrzyście, instancją jakiej klasy jest każda ze zmniennych, bo właśnie w tej funkcji są one deklarowane. Może poza zmienną str, ale po nazwie możesz się domyśleć, że to QString, oraz po tym, że metoda QWebFrame::setHtml() przyjmuje parametr QString (a nie żadne QLineEdit).

Ten post edytował peter13135 9.08.2012, 22:16:32
Go to the top of the page
+Quote Post
zegarek84
post
Post #3





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


popisz trochę więcej w JavaScript - to Ci powinno ułatwić programowanie zdarzeniowe... dodatkowo drzewo DOM w przeglądarkach zawsze renderowało się asynchronicznie (stąd były specjalnie tworzone metody pokroju .ready np. w jQuery)...
Cytat(peter13135 @ 9.08.2012, 22:46:09 ) *
edit://
Zrobiłem Twoją metodą, tzn nie łąduję za pomocą QNetworkManagera, tylko za pomocą QWebPage i teraz działa. Nie wiem tylko czemu tak wolno. I nadal nie wiem czemu sposób z użyciem setHtml() nie działa.

wyłącz obrazki i wyłącz wykonywanie JavaScript skoro to Ci nie potrzebne... w Twoim kodzie niewiele zmieniłem i działa - zdarzenie jest przypisane do QWebPage, więc musi on trochę dłużej istnieć itd... tabel z tą klasą znajduje 25...
  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3.  
  4. #include <QWidget>
  5. #include <QDebug>
  6. #include <QUrl>
  7. #include <QtNetwork>
  8. #include <QTextStream>
  9. #include <QWebElement>
  10. #include <QWebFrame>
  11. #include <QWebPage>
  12. #include <QWebView>
  13. #include <QtGui>
  14. #include <QRegExp>
  15. #include <QtXml>
  16.  
  17. class Widget : public QWidget
  18. {
  19. Q_OBJECT
  20. public:
  21. explicit Widget(QWidget *parent = 0);
  22. void startRequest(QUrl url);
  23.  
  24. private slots:
  25.  
  26. void httpFinished();
  27. void httpReadyRead();
  28. void htmlLoaded();
  29. private :
  30. QNetworkAccessManager qnam;
  31. QNetworkReply *reply;
  32. QString str;
  33. QPointer<QWebPage> page;
  34. QWebFrame * frame;
  35. //elementy gui
  36. };
  37.  
  38. #endif // WIDGET_H

  1. #include "widget.h"
  2.  
  3. Widget::Widget(QWidget *parent) :
  4. QWidget(parent),
  5. page(new QWebPage)
  6. {
  7. QUrl url("http://panoramafirm.pl/szukaj/mazowieckie,warszawa/firmy,1.html") ;
  8. startRequest(url);
  9. }
  10.  
  11.  
  12. void Widget::startRequest(QUrl url)
  13. {
  14.  
  15. str="";
  16. reply = qnam.get(QNetworkRequest(url));
  17.  
  18. connect(reply, SIGNAL(finished()),
  19. this, SLOT(httpFinished()));
  20. connect(reply, SIGNAL(readyRead()),
  21. this, SLOT(httpReadyRead()));
  22. }
  23.  
  24.  
  25.  
  26. void Widget::httpReadyRead()
  27. {
  28. str.append(QString::fromUtf8(reply->readAll()));
  29.  
  30. }
  31.  
  32. void Widget::httpFinished()
  33. {
  34. // QWebPage page;
  35. QWebSettings* s = page->settings();
  36. s->setAttribute(QWebSettings::AutoLoadImages, FALSE);
  37. s->setAttribute(QWebSettings::JavascriptEnabled, FALSE);
  38. frame = page->mainFrame();
  39. // qDebug() << 333333333;
  40. connect(page, SIGNAL(loadFinished(bool)), this, SLOT(htmlLoaded()));
  41. frame->setHtml(str);
  42. }
  43.  
  44. void Widget::htmlLoaded()
  45. {
  46. QWebElement document = frame->documentElement();
  47. QWebElementCollection tables = document.findAll("table.table");
  48. int num_tables = tables.count();
  49. qDebug() << num_tables;
  50. }


Ten post edytował zegarek84 10.08.2012, 00:30:10
Go to the top of the page
+Quote Post

Posty w temacie
- peter13135   [Qt] Parsowanie dokumentu www   4.08.2012, 15:30:02
- - everth   Dawno nie miałem już z Qt styczności ale spróbuj z...   6.08.2012, 12:51:01
- - cojack   Pobierz treść najprościej jak się da, wrzuć do DOM...   6.08.2012, 13:30:49
- - peter13135   Kod frame->setHtml(str); qDebug(...   6.08.2012, 19:20:43
- - rzymek01   ten kod, który podałeś znajduje się z źródle stron...   6.08.2012, 21:38:53
- - peter13135   Nie wiem o co Ci chodzi. Dałem linka w pierwszym p...   7.08.2012, 08:28:46
- - everth   Znalezione w necie: [CPP] pobierz, plaintext webVi...   7.08.2012, 11:04:53
- - peter13135   Zrobiłem inaczej. Za pomocą regexpa znalazłem pozy...   7.08.2012, 17:10:50
- - katsuo   Całe api webkita jest po to, żebyś nie musiał korz...   8.08.2012, 02:15:39
- - peter13135   CytatCałe api webkita jest po to, żebyś nie musiał...   8.08.2012, 16:39:56
- - katsuo   Zrobiłem po swojemu, wklejając kod gdzie trzeba. D...   8.08.2012, 18:36:53
- - everth   @katsuo prawdopodobnie ma rację. Jeśli QWebFrame z...   8.08.2012, 20:00:02
- - peter13135   Jak to debug zwrócił 0 i 25 ? Tabelek o tej klasie...   8.08.2012, 20:30:35
- - everth   Jeśli moje przypuszczenie jest poprawne - metoda s...   8.08.2012, 21:08:07
- - katsuo   1. Następnym razem dołączaj cały kod, nie wróżymy ...   8.08.2012, 21:24:12
- - peter13135   No dobra, więc przerobiłem swój kodzik na taki : ...   8.08.2012, 21:46:13
- - katsuo   spakuj cały projekt i wyślij na jakiś (lekki)hosti...   8.08.2012, 21:51:55
- - peter13135   http://www.sendspace.pl/file/b9a852801bddf23ea6047...   9.08.2012, 21:46:09
- - zegarek84   popisz trochę więcej w JavaScript - to Ci powinno ...   10.08.2012, 00:13:30


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 12.10.2025 - 23:08