2009-06-27 18 views
11

की सामग्री कैसे प्राप्त कर सकता हूं, मैं स्ट्रिंग में वेब पेज डेटा प्राप्त करने की कोशिश कर रहा हूं, इससे मैं इसे पार्स कर सकता हूं। मुझे qwebview, qurl और अन्य में कोई विधि नहीं मिली। क्या तुम मेरी मदद कर सकते हो? लिनक्स, सी ++, क्यूटी।मैं वेब पेज

संपादित करें:

मदद के लिए धन्यवाद। कोड काम कर रहा है, लेकिन डाउनलोड करने के बाद कुछ पेजों ने अक्षरसेट तोड़ दिया है। मैं इसे मरम्मत के लिए कुछ इस तरह की कोशिश की:

QNetworkRequest *request = new QNetworkRequest(QUrl("http://ru.wiktionary.org/wiki/bovo")); 

request->setRawHeader("User-Agent", "Mozilla/5.0 (X11; U; Linux i686 (x86_64); " 
         "en-US; rv:1.9.0.1) Gecko/2008070206 Firefox/3.0.1"); 
request->setRawHeader("Accept-Charset", "win1251,utf-8;q=0.7,*;q=0.7"); 
request->setRawHeader("charset", "utf-8"); 
request->setRawHeader("Connection", "keep-alive"); 

manager->get(*request); 

कोई परिणाम = (

उत्तर

26

आप देखा QNetworkAccessManager पर यहाँ एक किसी न किसी और के लिए तैयार नमूना illustrating उपयोग है है:।?

class MyClass : public QObject 
{ 
Q_OBJECT 

public: 
    MyClass(); 
    void fetch(); 

public slots: 
    void replyFinished(QNetworkReply*); 

private: 
    QNetworkAccessManager* m_manager; 
}; 


MyClass::MyClass() 
{ 
    m_manager = new QNetworkAccessManager(this); 

    connect(m_manager, SIGNAL(finished(QNetworkReply*)), 
     this, SLOT(replyFinished(QNetworkReply*))); 

} 

void MyClass::fetch() 
{ 
    m_manager->get(QNetworkRequest(QUrl("http://stackoverflow.com"))); 
} 

void MyClass::replyFinished(QNetworkReply* pReply) 
{ 

    QByteArray data=pReply->readAll(); 
    QString str(data); 

    //process str any way you like! 

} 

में अपने finished सिग्नल के लिए अपने हैंडलर में आपको QNetworkReply ऑब्जेक्ट पास किया जाएगा, जिसे आप QIODevice से प्राप्त होने वाले प्रतिक्रिया को पढ़ सकते हैं। ऐसा करने का एक आसान तरीका सिर्फ ca QByteArray प्राप्त करने के लिए readAll देखेंगे। आप उस QByteArray से QString बना सकते हैं और जो भी आप इसके साथ करना चाहते हैं।

+0

उत्तर देने के लिए धन्यवाद। लेकिन मुझे एक त्रुटि मिली: ऑब्जेक्ट :: कनेक्ट: ऐसा कोई स्लॉट मेनविंडो :: उत्तर समाप्त नहीं हुआ (QNetworkReply *) – Ockonal

+0

आपको हस्ताक्षर शून्य उत्तर के साथ प्राप्त करने वाले वर्ग में स्लॉट जोड़ने की आवश्यकता है समाप्त (QNetworkReply *) –

+0

क्षमा करें, मुझे समझ में आया। लेकिन मुझे नहीं पता कि डेटा को अभी तक कैसे पढ़ा जाए। कृपया मेरी मदद करें, कृपया – Ockonal

1

क्या आपने लिंक्स, कर्ल, या wget में देखा है? अतीत में मुझे किसी वेबसाइट, सैन्स डीबी एक्सेस से जानकारी को पकड़ने और विश्लेषण करने की आवश्यकता होती है, और यदि आप गतिशील रूप से स्वरूपित डेटा प्राप्त करने का प्रयास कर रहे हैं, तो मेरा मानना ​​है कि यह सबसे तेज़ तरीका होगा। मैं एक सी लड़का नहीं हूं, लेकिन मुझे लगता है कि शैल स्क्रिप्ट चलाने और डेटा को पकड़ने का एक तरीका है, या कम से कम स्क्रिप्ट चलाना और इसे लिखने के बाद फ़ाइल से आउटपुट लेना। सबसे खराब स्थिति परिदृश्य, आप एक क्रॉन चला सकते हैं और सी के साथ लिखित फाइल के अंत में "समाप्त" रेखा की जांच कर सकते हैं, लेकिन मुझे संदेह है कि यह आवश्यक होगा। मुझे लगता है कि यह इस बात पर निर्भर करता है कि आपको इसकी क्या आवश्यकता है, लेकिन यदि आप केवल एक पृष्ठ के आउटपुट एचटीएमएल चाहते हैं, तो पूर्व में कुछ जो कि अजीब या grep के लिए पाइप की तरह wget के रूप में कुछ चमत्कार कर सकते हैं।

2

पॉल डिक्सन का जवाब शायद सबसे अच्छा तरीका है लेकिन जेसी का जवाब उल्लेख करने योग्य कुछ स्पर्श करता है।

curl - या अधिक सटीक libcURL एक अद्भुत शक्तिशाली पुस्तकालय है। शैल स्क्रिप्ट्स और पार्सिंग आउटपुट को निष्पादित करने की कोई आवश्यकता नहीं है, libCURL सी, सी ++ और अधिक भाषाओं को उपलब्ध है, इससे आप एक यूआरएल हिला सकते हैं। यह उपयोगी हो सकता है यदि आप कुछ अजीब ऑपरेशन कर रहे हैं (जैसे एसएसएल पर http POST?) कि qt समर्थन नहीं करता है।

+0

क्या कोई यह पुष्टि कर सकता है कि क्यूटी एसएसएल के माध्यम से POST को संभाल नहीं सकता है? – Andrioid

+1

@Andrioid Qt समस्याओं के बिना एसएसएल के माध्यम से पोस्ट को संभालता है। –

+0

मुझे लगता है कि सी-ओ-आर-ई का मतलब है कि क्यूटी आपके लिए ऐसा नहीं करता है, आपको केवल एक समाधान के रूप में क्यूटी का उपयोग करने के लिए एक उपकरण के रूप में उपयोग करना होगा? –

संबंधित मुद्दे