2010-05-21 22 views
5

एचटीएमएल की एक स्ट्रिंग लेने और इसे कुछ उपयोगी में बदलने का सबसे अच्छा तरीका क्या है?सी # पार्सिंग एचटीएमएल?

अनिवार्य रूप से यदि मैं एक यूआरएल लेता हूं और HTML में उस यूआरएल से HTML प्राप्त करता हूं तो मुझे प्रतिक्रिया मिलती है लेकिन यह फ़ाइल या स्ट्रीम या स्ट्रिंग के रूप में आती है।

क्या होगा यदि मैं एक वास्तविक दस्तावेज़ या कुछ जिसे मैं XmlDocument ऑब्जेक्ट की तरह क्रॉल कर सकता हूं?

मेरे पास कुछ विचार और पहले से ही लागू समाधान है लेकिन मुझे यह देखने में दिलचस्पी है कि समुदाय इस बारे में क्या सोचता है।

+1

एक्सएमएल पार्सिंग के लिए .NET पुस्तकालयों का उपयोग क्यों न करें? – Joren

+0

lol मुझे विश्वास नहीं है कि आपने कहा है कि ... html xml नहीं है, कुछ चीजें जो वैध एचटीएमएल वैध xml नहीं हैं, यह काम नहीं करेगी। – War

उत्तर

3

मैं mshtml api का उपयोग करता हूं।

बस mshtml असेंबली का संदर्भ लें और फिर नामस्थान शामिल करें।

वहां से आप एक HTMLDocument ऑब्जेक्ट घोषित कर सकते हैं जो क्वेरी करने योग्य है, यह स्थानों में थोड़ा सिरदर्द है क्योंकि एपीआई डिज़ाइन आपको यादृच्छिक कास्टिंग करने के लिए मजबूर करता है लेकिन यह काम पूरा हो जाता है और इसे हमेशा उपयोग में लाया जा सकता है इस पर कक्षा है ताकि आपको अपने मुख्य ऐप कोड कक्षाओं में अपनी विषमताएं रखने की आवश्यकता न हो।

7

एक्सएचटीएमएल में लिखे गए एचटीएमएल पेज शायद ही कभी वैध एक्सएमएल हैं, इसलिए उन्हें मानक एक्सएमएल ऑब्जेक्ट में लोड नहीं किया जा सकता है।

HTML Agility Pack पर एक नज़र डालें। यह .NET घटक आपको डीओएम को पार करने की अनुमति देगा भले ही यह मान्य न हो।

+0

Thats क्यों मैंने कहा "एक XML दस्तावेज़ की तरह" जैसा कि ... जैसा कि मुझे यह बहुत अच्छा पता है। – War

1
var browser = new System.Windows.Forms.WebBrowser(); 
browser.Navigate(new System.Uri("http://example.com")); 
var doc = browser.Document; 

HtmlDocument जो एक सामान्य संग्रह ICollection<HtmlControl> बन सकता है उपयोगी members

उदाहरण के लिए, doc.All जो HtmlControlCollection है की एक संख्या है।

HtmlControl.DomElementmshtml नामस्थान को दूसरे उत्तर में उल्लिखित संदर्भित करता है।

कुछ के उपयोग का उदाहरण आप the source of this project

+0

सरल ... बहुत सरल ...लेकिन इसे आजमाएं ... 1. नया कंसोल ऐप बनाएं 2. उस कोड को पर रखें 3. System.Windows.Forms पर एक संदर्भ जोड़ें 4. इसे चलाएं। यह नमूना तोड़ने लगता है, mshtml api का उपयोग नहीं करता है, हालांकि चपलता पैक के बारे में निश्चित नहीं है। – War

+0

@ वार्डी: वेब ब्रोसर नियंत्रण कंसोल एप्लिकेशन में काम नहीं करता है क्योंकि यह COM ऑब्जेक्ट पर एक रैपर है जो एसटीए मोड – abatishchev

+0

में नहीं चलाया जा सकता है, वास्तव में, मेरे पास एक स्टैंडअलोन असेंबली के हिस्से के रूप में काम करने वाला कोड है, मैं बस इसे संदर्भित करता हूं और उपयोग करता हूं यह आवश्यकतानुसार, सबसे अच्छा समाधान हमेशा एक अच्छा साफ पोर्टेबल है :) – War

1

में सबसे आसान तरीका मिल सकता है System.Windows.Forms.HtmlDocument वर्ग में लोड करने के लिए है। फिर आप वहां से डीओएम तक पहुंच सकते हैं।

बेशक आप HTTP प्रतिक्रिया में सामग्री-प्रकार को देखना चाहते हैं यह निर्धारित करने के लिए कि यह वास्तव में HTML है (जिसे संदर्भित किया गया है) या यदि यह शायद छवि के रूप में बाइनरी डेटा है।

HTTP मूल रूप से केवल कच्चे दस्तावेज़ को थकाता है जो या तो बाइनरी डेटा या मार्कअप टेक्स्ट होता है और ब्राउजर आमतौर पर प्रतिक्रिया हेडर में दिए गए संकेतों का उपयोग करके शेष करता है। यह निश्चित रूप से उपयोग करने के लिए तैयार HTTPWebResponse क्लैस में अच्छी तरह से लपेटा गया है।

+0

मुझे वेब समस्या के लिए विंडोज़ फॉर्मों पर उस निर्भरता की कल्पना नहीं है, जबकि यह तकनीकी रूप से "सबसे आसान तरीका" है, यह सबसे व्यावहारिक नहीं है ... गैर-प्रासंगिक निर्भरता क्यों पेश करें? – War

3

आप अपनी प्रतिक्रिया में प्राप्त एचटीएमएल को प्रारूपित करने के लिए Tidy.net का उपयोग कर सकते हैं। फिर आप उसे XmlDocument में लोड करने में सक्षम होंगे और जो भी चाहते हैं उसे प्राप्त करने के लिए नोड्स को पार करें।

Tidy document = new Tidy(); 
TidyMessageCollection messageCollection = new TidyMessageCollection(); 

document.Options.DocType = DocType.Omit; 
document.Options.Xhtml = true; 
document.Options.CharEncoding = CharEncoding.UTF8; 
document.Options.LogicalEmphasis = true; 

document.Options.MakeClean = false; 
document.Options.QuoteNbsp = false; 
document.Options.SmartIndent = false; 
document.Options.IndentContent = false; 
document.Options.TidyMark = false; 

document.Options.DropFontTags = false; 
document.Options.QuoteAmpersand = true; 
document.Options.DropEmptyParas = true; 

MemoryStream input = new MemoryStream(); 
MemoryStream output = new MemoryStream(); 
byte[] array = Encoding.UTF8.GetBytes(xmlResult); 
input.Write(array, 0, array.Length); 
input.Position = 0; 

document.Parse(input, output, messageCollection); 

string tidyXhtml = Encoding.UTF8.GetString(output.ToArray()); 

XmlDocument outputXml = new XmlDocument(); 
outputXml.LoadXml((tidyXhtml); 
+0

इस घटक के लिए कोई विस्तृत दस्तावेज? – Smith

+0

उस साफ परियोजना का प्रयास करें जो tidy.net से लिया गया था। नहीं .net लेकिन आपको उपयोग का विचार देना चाहिए। http://tidy.sourceforge.net/ – skyfoot

+0

दिलचस्प है लेकिन एक पठनीय राज्य में दस्तावेज़ प्राप्त करने के लिए बहुत सारे कोड हैं जो आपको नहीं लगता? ... अगर आपको लगता है कि मुझे केवल एक बार लिखना है तो बहुत बुरा नहीं है ... हालांकि मैं प्रदर्शन – War

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