2017-11-01 48 views
5

एक वेब पेज पूरी तरह से लोड होने तक कोड को रोकने के लिए, मैं लगभग हर समय बड़ी सफलता के साथ नीचे दी गई विधि का उपयोग कर रहा हूं।एक्सेल वीबीए में, यह जांचने का तरीका क्या है कि वेब पेज पूरी तरह लोड हो गया है या नहीं?

Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop 

लेकिन कभी कभी, मैं पाठ सामग्री लोड करने के बाद विधि निर्धारित करता है कि पृष्ठ पूरी तरह लोड, और इतना है कि सामग्री निकाले नहीं है देखते हैं।

हालांकि, अगर मैं एफ 8 के माध्यम से कोड के माध्यम से कदम उठाता हूं, तो सामग्री हर बार निकाली जाती है। यह तेजी से किया जाता है क्योंकि मैं बार-बार F8 कुंजी दबा सकता हूं।

तो मैं पेज को सुनिश्चित करने के लिए कैसे जांच सकता हूं, और इसकी सभी सामग्री डेटा को निकालने के पहले कोड पूरी तरह से लोड हो जाती है?

दोनों मामलों में, आईई अदृश्य चल रहा है। हालांकि, मैंने आईई के साथ यह कोशिश की है और वास्तव में उन पृष्ठों पर इस विशिष्ट स्थान पर सामग्री है जिनके साथ मैं काम कर रहा हूं।

यह वीबीए स्क्रिप्ट का उपयोग करते हुए एक्सेल 2016 में किया जा रहा है। विशिष्ट सामग्री अनुरोध की तरह लिखा है:

'get item name from page and write it to the first cell on the first empty row available 
Set itemName = objIE.document.querySelector(".the-item-name") 
Worksheets("Results").Range("A1048576").End(xlUp).Offset(1, 0).Value = itemName.innerText 

मैं Excel VBA: Wait for JavaScript execution in Internet Explorer के माध्यम से पढ़ा है, क्योंकि मुझे लगता है कि शायद मूल्यों के बाद दस्तावेज़ लोड किया जाता है जोड़ा जा रहा है, डेटा scraping से किसी को रोकने के प्रयास में। हालांकि, मैं ऐसा कुछ स्क्रिप्ट पहचानने की प्रतीत नहीं कर सकता जो ऐसा कर सकता है। इसका मतलब यह नहीं है कि यह वहां नहीं है। मैं अभी तक इसे नहीं देख सकता। -/each:,, कीमत से पहले लोड किए जा रहे हैं, जिससे कि क्या अनुरोध वापस आ जाएगी है -()

इस मुद्दे के साथ पेज का एक विशिष्ट उदाहरण यूआरएल

https://www.homedepot.ca/en/home/p.dry-cloth-refills-32---count.1000660019.html

प्रारंभ में product-total-price div तत्व पानी का छींटा शामिल है $11.29/each के बजाय।

मेरे पास एक कामकाज है, लेकिन यह उतना कुशल या संक्षिप्त नहीं है जितना मैं चाहता हूं। मैं डैश की उपस्थिति के लिए लौटाई स्ट्रिंग का परीक्षण करता हूं। यदि यह वहां है, लूप और इसे फिर से जांचें, तो इसे कैप्चर करें और इसे वर्कशीट में डालें।

setPriceUM: 
    Set hdPriceUM = objIE.document.querySelector(".product-total-price").innerTe‌​‌​xt 
    hdPriceUMString = hdPriceUM.innerText 
    stringTest = InStr(hdPriceUMString, "-") 
    If stringTest = True Then 
     GoTo setPriceUM 
    Else 
     Debug.Print hdPriceUMString 
    End If 

इसे पढ़ने और इसे मानने के लिए समय निकालने के लिए धन्यवाद।

+1

उत्कृष्ट प्रश्न। मैं इस मुद्दे के साथ भी संघर्ष करता हूं, लेकिन सौभाग्य से, जिस तरह से मैंने हमेशा अपनी समस्या हल की है, प्रारंभिक लूप के बाद एक लूप जोड़ रहा था जिसमें 'ऑब्जेक्ट' उपलब्ध था जब तक कि मेरी वस्तु उपलब्ध न हो जाए। तो, मेरा सवाल है: पृष्ठ के बाद पूरी तरह से "लोड" के बाद आपकी सभी वस्तुएं उपलब्ध हैं? उदाहरण: आप 'सबमिटबीटीएन = doc.getElement .....' सेट करें ... क्या वह 'कुछ भी नहीं' है, रनटाइम त्रुटि को संकेत देता है? –

+0

मैं भी इस समस्या में भाग गया है, लेकिन यह आमतौर पर एक नेटवर्क समस्या है। जब नेटवर्क तेजी से चल रहा है, कोई समस्या नहीं है, लेकिन जब यह कुछ अंतराल समय दिखाना शुरू होता है, तो पेज पूरी तरह से लोड नहीं होते हैं। मुझे अतिरिक्त समय की अनुमति देने के लिए प्रतीक्षा टाइमर जोड़ने का सहारा लेना पड़ा। 'आवेदन। प्रतीक्षा करें (अब + टाइमवैल्यू ("0:00:06"))' यह 6 सेकंड का इंतजार है। – Mitch

+0

@ मिच टाइमर अविश्वसनीय समाधान है, खासकर धीमी नेटवर्क के लिए। – omegastripes

उत्तर

1

वेबपृष्ठों की कार्यक्षमता बहुत अलग है, इसलिए कोई समाधान नहीं है जो उन सभी के लिए उपयुक्त होगा।

अपने उदाहरण के बारे में, अपने तरीके को एक काम कर समाधान है, कोड हो सकता है जैसे:

Sub TestIE() 

    Dim q 

    With CreateObject("InternetExplorer.Application") 
     .Visible = True 
     .Navigate "https://www.homedepot.ca/en/home/p.dry-cloth-refills-32---count.1000660019.html" 
     ' Wait IE 
     Do While .readyState < 4 Or .Busy 
      DoEvents 
     Loop 
     ' Wait document 
     Do While .document.readyState <> "complete" 
      DoEvents 
     Loop 
     ' Wait element 
     Do 
      q = .document.querySelector(".product-total-price").innerText 
      If Left(q, 1) <> "-" Then Exit Do 
      DoEvents 
     Loop 
     .Quit 
    End With 
    Debug.Print q 

End Sub 

वैसे भी, आप वेब पेज लोड हो रहा है प्रक्रिया, XHRs और डोम संशोधनों पर गौर करने की जरूरत है, ब्राउज़र डेवलपर उपकरण का उपयोग कर (F12)। इस तरह से जाकर, आप पाएंगे कि कई एक्सएचआर जेएसओएन प्रारूप में कीमत लौटाते हैं। यह पृष्ठ लोड होने के दौरान दिखाई देने वाली कीमत से ठीक पहले ब्राउज़र डेवलपर टूल के नेटवर्क टैब पर लॉग ऑन है। वह एक्सएचआर भारित जेएस में से एक द्वारा किया जाता है, विशेष रूप से पेज लोड होने के बाद।इस URL (मैं तो बस नेटवर्क टैब से कॉपी) का प्रयास करें:

https://www.homedepot.ca/homedepotcacommercewebservices/v2/homedepotca/products/1000660019/localized/9999?catalogVersion=Online&lang=en

तो तुम सिर्फ इतना है कि एक्सएचआर पुन: पेश कर सकते हैं और बंटवारे से मूल्य निकालने:

Sub TestXHR() 

    Dim q 

    With CreateObject("MSXML2.XMLHTTP") 
     .Open "GET", "https://www.homedepot.ca/homedepotcacommercewebservices/v2/homedepotca/products/1000660019/localized/9999?catalogVersion=Online&lang=en", False 
     .Send 
     q = .ResponseText 
    End With 
    q = Replace(q, " : ", ":") 
    q = Split(q, """displayPrice""", 2)(1) 
    q = Split(q, """formattedValue"":""", 2)(1) 
    q = Split(q, """", 2)(0) 
    Debug.Print q 

End Sub 

लेकिन फिर, वहाँ कोई आम है मामला।

+0

ओमेगास्ट्रिप्स, जो आपने पहले कोड स्निपेट में किया है, वह मेरे कामकाज के लगभग समान है, इसलिए यह मुझे प्रोत्साहित करता है कि मेरी कोडिंग गुणवत्ता साथ आ रही है। एक्सएचआर मेरे लिए नया हैश है और मैंने 15 साल पहले पहली बार दिखाई देने के बाद से कोई JSON काम नहीं किया है। मैं उन दोनों पर गति प्राप्त करूंगा। मैंने पिछले हफ्ते MSXML2.XMLHTTP फ़ंक्शन को देखना शुरू कर दिया था। मेरा मानना ​​है कि आप सही हैं कि यह जाने का रास्ता है। मैं इसे काम पर जाने दूंगा और यहां वापस रिपोर्ट करूंगा। धन्यवाद! – Innertube

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

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