Html चपलता पैक - एक आसान .NET HTML पार्सर

सभी को नमस्कार!

एक बार, मेरे पास यह विचार आया कि हम्बरे पर पोस्ट की गई रिक्तियों का विश्लेषण करें। मुझे विशेष रूप से दिलचस्पी थी कि क्या वेतन के आकार और उच्च शिक्षा की उपलब्धता के बीच संबंध है। और अब छात्रों को एक सत्र (मेरा सहित) हो रहा है, तो शायद कोई पहले से ही परीक्षा में अपने तंत्रिकाओं पर जाने की कोशिश कर रहा है और यह विश्लेषण उपयोगी होगा।

चूंकि मैं .Net पर एक प्रोग्रामर हूं, इसलिए मैंने इस समस्या को हल करने का फैसला किया - मैंने C # में हैबर पर विज्ञापनों को पार्स करने का फैसला किया। मैं html लाइनों को मैन्युअल रूप से पार्स नहीं करना चाहता था, इसलिए मैंने एक html पार्सर खोजने का फैसला किया जो कार्य को पूरा करने में मदद करेगा।

आगे देखते हुए, मैं कहूंगा कि विश्लेषण से कुछ भी दिलचस्प नहीं निकला और सत्र को और आगे ले जाना होगा :(

लेकिन तब मैं बहुत उपयोगी Html Agility Pack लाइब्रेरी के बारे में बात करूँगा



पार्सर चयन



मैं Stackoverflow पर चर्चा के माध्यम से इस पुस्तकालय में गया। उदाहरण के लिए, टिप्पणियों ने भी समाधान सुझाए, उदाहरण के लिए, SgmlReader लाइब्रेरी, जो HTML को XmlDocument में अनुवाद करती है, और XML के लिए टूल्स का पूरा सेट .Net टूल्स में। लेकिन किसी कारण से इसने मुझे रिश्वत नहीं दी और मैं Html Agility Pack डाउनलोड करने गया।



त्वरित टूर एचटीएमएल चपलता पैक



पुस्तकालय के लिए मदद परियोजना पृष्ठ पर डाउनलोड की जा सकती है। कार्यक्षमता वास्तव में बहुत खुश है।

हमारे लिए बीस मुख्य कक्षाएं उपलब्ध हैं:







विधियों के नाम DOM इंटरफेस ( टिप्पणी k12th ) + बन्स: GetElementbyId (), CreateAttribute (), CreateElement (), आदि के अनुरूप हैं, इसलिए यह विशेष रूप से सुविधाजनक होगा यदि आपको जावास्क्रिप्ट के साथ सौदा करना था

ऐसा लगता है कि HTML अभी भी Xml में ओवरराइड है, और HtmlDocument और अन्य वर्ग एक रैपर हैं, ठीक है, इसके साथ कुछ भी गलत नहीं है, क्योंकि, इस तरह की विशेषताएं हैं:



परसिम हबर!



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

तो, चलिए शुरू करते हैं, हमें लिंक की आवश्यकता है और वहां से वेतन के साथ स्थिति के बारे में जानकारी प्राप्त करने के लिए एक तालिका चाहिए:

  1. स्थिर शून्य GetJobLinks ( HtmlDocument html )
  2. {
  3. var trNodes = html। GetElementbyId ( "नौकरी-आइटम" )बाल-बच्चेजहाँ ( x => x। Name == "tr" ) ;
  4. foreach ( trNodes में var आइटम )
  5. {
  6. var tdNodes = आइटम। बाल-बच्चेजहाँ ( x => x। Name == "td" )ToArray ( ) ;
  7. अगर ( tNNodes। गिनती ) ( ! = 0 )
  8. {
  9. var स्थान = tdNodes [ 2 ]बाल-बच्चेजहाँ ( x => x। Name == "a" )ToArray ( ) ;
  10. jobList। जोड़ें ( नया HabraJob )
  11. {
  12. अर्ल = tdNodes [को ]बाल-बच्चेपहला ( )विशेषताएँ [ "href" ]मूल्य,
  13. शीर्षक = tdNodes [को ]FirstChild। इनरटेक्स्ट ,
  14. मूल्य = tdNodes [ 1 ]FirstChild। इनरटेक्स्ट ,
  15. देश = स्थान [को ]इनरटेक्स्ट ,
  16. क्षेत्र = स्थान [ ]इनरटेक्स्ट ,
  17. शहर = स्थान [ ]innerText
  18. } ;
  19. }
  20. }
  21. }


उसके बाद, प्रत्येक लिंक के माध्यम से जाना और शिक्षा के बारे में जानकारी प्राप्त करना आवश्यक है, और एक ही समय में रोजगार भी - इसमें एक छोटी सी समस्या है कि अगर रिक्ति के लिंक वाली तालिका आईडी में ज्ञात आईडी के साथ थी, तो रिक्ति के बारे में जानकारी बिना किसी तालिका में निहित है आईडी, इसलिए मुझे थोड़ा मोड़ना पड़ा:

  1. स्थिर शून्य GetFullInfo ( हबराज जॉब )
  2. {
  3. HtmlDocument html = नया HtmlDocument ( ) ;
  4. एचटीएमएल। LoadHtml ( wClient। DownloadString ( नौकरी Url ) ) ;
  5. // html.LoadHtml (GetHtmlString (job.Url));
  6. // यह नहीं किया जा सकता है :-(
  7. var तालिका = html। GetElementbyId ( "मुख्य सामग्री" )बाल-बच्चे [ ]बाल-बच्चे [ ]बाल-बच्चे [ ]चाइल्डनॉड्स [ 2 ]बाल-बच्चे [ ]चाइल्डनॉड्स [ 3 ]बाल-बच्चेजहाँ ( x => x। Name == "tr" )ToArray ( ) ;
  8. फॉरच ( तालिका में var tr )
  9. {
  10. स्ट्रिंग श्रेणी = त्र। बाल-बच्चेFindFirst ( "वें" )इनरटेक्स्ट ;
  11. स्विच ( श्रेणी )
  12. {
  13. मामला "कंपनी" :
  14. नौकरी। कंपनी = tr। बाल-बच्चेFindFirst ( "td" )FirstChild। इनरटेक्स्ट ;
  15. तोड़ना ;
  16. मामला "शिक्षा:" :
  17. नौकरी। शिक्षा = हबराज। ParseEducation ( त्रि। चाइल्डनोड्सFindFirst ( "td" )इनर टेक्स्ट ) ;
  18. तोड़ना ;
  19. मामला "रोजगार:" :
  20. नौकरी। रोजगार = हबराज। ParseEmployment ( त्रि। चाइल्डनॉड्सफाइंडफर्स्ट ( "td" )इनरटेक्स्ट ) ;
  21. तोड़ना ;
  22. डिफ़ॉल्ट :
  23. जारी रखें ;
  24. }
  25. }
  26. }


परिणाम



ठीक है, फिर, हम XML में परिणाम सहेजते हैं और Excel-e में देखते हैं कि क्या हुआ ... और हम देखते हैं कि कुछ भी अच्छा नहीं हुआ, क्योंकि ज्यादातर कंपनियां या तो वेतन की राशि का संकेत नहीं देती हैं, या शिक्षा के बारे में जानकारी नहीं दिखाती हैं (भूल जाओ, शरीर में इंगित करें रिक्तियों, या तो वास्तव में महत्वहीन), या एक ही बार में सब कुछ इंगित नहीं करते हैं।

कौन परवाह करता है, यहाँ xlsx और xml में परिणाम हैं, और यहाँ स्रोत है



पुनश्च



जब पार्स कर रहा था, तो ऐसी समस्या थी - पृष्ठ बहुत धीरे-धीरे डाउनलोड हुए। इसलिए मैंने पहले WebClient की कोशिश की और फिर WebRequest की, लेकिन कोई फर्क नहीं पड़ा। एक Google खोज ने संकेत दिया कि आपको स्पष्ट रूप से प्रॉक्सी को कोड में अक्षम करना चाहिए, और फिर सबकुछ ठीक हो जाएगा, लेकिन इससे भी मदद नहीं मिली।



All Articles