2010-10-18 17 views
10

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

यहां तक ​​कि उनके मुखपृष्ठ पर उदाहरण कोड मेरे लिए त्रुटियां उत्पन्न करता है।

मेरे कोड:

'HtmlDocument' 'System.Windows.Forms.HtmlDocument' और 'HtmlAgilityPack.HtmlDocument' सी के बीच एक अस्पष्ट संदर्भ है:

  HtmlDocument doc = new HtmlDocument(); 
     doc.Load("https://www.flashback.org/u479804"); 
     foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"]) 
     { 
      HtmlAttribute att = link["href"]; 
      att.Value = FixLink(att); 
     } 
     doc.Save("file.htm"); 

निम्न त्रुटि उत्पन्न करता है * \ Form1.cs

संपादित करें: मेरे पूरे कोड यहाँ स्थित है: http://beta.yapaste.com/55

सभी मदद की बहुत सराहना की है!

+0

जैसा कि मैंने नीचे दिए गए मेरे जवाब में उल्लेख किया है, मैं वास्तव में यह नहीं बता सकता कि आप क्या करने की कोशिश कर रहे हैं। यदि आप उस कार्य का वर्णन कर सकते हैं जिसे आप कुछ और विस्तार से प्राप्त करने का प्रयास कर रहे हैं, तो मैं इसे प्राप्त करने के लिए नमूना ऐप लिखने में आपकी सहायता करने की कोशिश करूंगा। – rtpHarry

+0

मुझे लगता है कि आप संकलक को बंद करने के लिए "HtmlDocument" के बजाय "HtmlAgilityPack.HtmlDocument" का उपयोग कर सकते हैं। –

+0

आह, यह "HtmlDocument = System.Windows.Forms.HtmlDocument का उपयोग कर रहा था;" कि किसी भी तरह से "जादुई" मेरे उपयोग खंड में जोड़ा गया है, जो HtmlDocument क्लास के HtmlAgilityPack संस्करण को अस्पष्ट कर रहा था। –

उत्तर

9

उपयोग HtmlAgilityPack.HtmlDocument:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 

संकलक उलझन में है हो रही नामस्थान आप using साथ आयात किया है की दो HtmlDocument बुलाया वर्गों को शामिल क्योंकि - एचटीएमएल चपलता पैक नाम स्थान, और Windows Forms नाम स्थान। आप स्पष्ट रूप से किस वर्ग का उपयोग करना चाहते हैं उसे निर्दिष्ट करके आप इसे प्राप्त कर सकते हैं।

+0

फिर मुझे एक और त्रुटि मिलती है: 'HtmlAgilityPack.HtmlDocument' में 'DocumentElement' की परिभाषा नहीं है और 'HtmlAgilityPack.HtmlDocument' प्रकार के पहले तर्क को स्वीकार करने वाली कोई एक्सटेंशन विधि 'DocumentElement' नहीं मिल सकती है (क्या आप निर्देश का उपयोग कर रहे हैं या एक असेंबली संदर्भ?) –

+0

@ विक्टर: मुझे पुस्तकालय के सटीक लेआउट का वास्तव में यकीन नहीं है, लेकिन मुझे उदाहरण कोड http://htmlagilitypack.codeplex.com/wikipage?title=Examples&referringTitle=Home दिखाई देता है। उस पृष्ठ के निचले हिस्से में टिप्पणी से, आप 'DocumentElement' के बजाय' DocumentNode' को आजमा सकते हैं। हालांकि यह एक लंबे शॉट का थोड़ा सा है ... –

+0

दस्तावेज़ नोड मुझे और त्रुटियां देता है कि DocumentElement –

2

दो नामस्थानों में कक्षा System.Windows.Forms और HtmlAgilityPack विरोधाभासी हैं। पूरी तरह से योग्य प्रकार के नामों का उपयोग करें या नामस्थान उपनाम का उपयोग करें।

+0

इससे मुझे बहुत मदद नहीं मिली, क्या आप विकसित कर सकते हैं कि मुझे थोड़ा और क्या करना चाहिए? –

1

मैंने कुछ लेख लिखे हैं जो बताते हैं कि HtmlAgilityPack का उपयोग कैसे करें। आप उन्हें उपयोगी आरंभ करने के लिए मिल सकती है:

चेतावनी (2012-06-08): यह लिंक थोड़ा spammy है - कुशल पॉप के तहत विज्ञापनों, नहीं अधिक सामग्री।

मुझे नहीं पता कि उन्होंने अभी इसे ठीक कर दिया है, लेकिन उस स्निपेट को साइट के मुखपृष्ठ पर काम करने के लिए उपयोग नहीं किया गया था, मुझे लगता है कि यह पुस्तकालय के पहले संस्करण से था। इसके अलावा स्निपेट FixLink() को परिभाषित नहीं करता है, इसलिए यह लाइब्रेरी के लिए सही होने पर भी काम नहीं करेगा।

मैं लाइब्रेरी का नवीनतम बीटा संस्करण प्राप्त करने की अनुशंसा करता हूं क्योंकि इसके खिलाफ linq क्वेरी करने के लिए अतिरिक्त एक्सटेंशन हैं जो आपको बाद में xpath प्रश्नों को भ्रमित करने से बचा सकता है।

मैं इसे एक Windows में इस्तेमाल नहीं देखा है पहले इस ऐप्लिकेशन फॉर्म्स लेकिन यह लगता है कि आप पूरी तरह से योग्य प्रकार के नाम का उपयोग करना होगा जैसे:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 

वास्तविक कार्य आप प्रदर्शन करने के लिए कोशिश कर रहे हैं के लिए के रूप में , ऐसा लगता है कि आप एक यूआरएल लेना चाहते हैं, इसमें उपयोगकर्ता नाम और आईडी डालें और फिर ... सुनिश्चित नहीं है? आप ऐसा लगता है कि आप फ़ाइल को डिस्क पर सहेजने की कोशिश कर रहे हैं और एचटीएमएल कोड को एक फॉर्म की सामग्री पर सेट कर रहे हैं जो मुझे नहीं लगता कि आप कर सकते हैं?

+0

@tomfanning - अधिसूचना के लिए धन्यवाद, ऐसा लगता है कि विगेट्स में से एक उपयोगकर्ताओं को स्पैमिंग कर रहा था। मैंने पोस्टरैंक और Blogged.com विजेट हटा दिए हैं और मुझे अब स्पैम पॉप अंडर नहीं दिख रहा है। – rtpHarry

5

इस प्रकार मैंने हासिल किया। ध्यान दें कि फोरैच लाइन डॉक में मुख्य Html Agility Pack Example में दी गई कोड त्रुटि है।DocumentElement.SelectNodes ("// एक [@href"])। सही और परीक्षण एक नीचे दिया गया है।

HtmlWeb hw = new HtmlWeb(); 

    HtmlDocument doc = hw.Load(@"http://tipscow.com"); 
    StringBuilder sb = new StringBuilder(); 

    List<string> lstHref = new List<string>(); 

    foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]").Distinct()) 
    { 
     string curHref = link.Attributes["href"].Value; 

     if(!lstHref.Contains(curHref)) 
     lstHref.Add(curHref); 

    } 
    foreach (string str in lstHref) 
    { 
     sb.Append(str +"<br />"); 
    } 

    Response.Write (sb.ToString()); 

चूंकि यह मेरे लिए काम कर रहा है, मैंने सोचा कि मुझे साझा करना चाहिए।

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