2011-03-29 12 views
6

मैं इंटरनेट से डाउनलोड किए गए एचटीएमएल पेज से कुछ लिंक निकालना चाहता हूं, मुझे लगता है कि XML से linq का उपयोग करना मेरे मामले के लिए एक अच्छा समाधान होगा।HTML को XML के रूप में कैसे पढ़ा जाए?

public static string readHTML(string url) 
    { 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
     HttpWebResponse res = (HttpWebResponse)req.GetResponse(); 
     StreamReader sr = new StreamReader(res.GetResponseStream()); 

     string html = sr.ReadToEnd(); 
     sr.Close(); 
     return html; 
    } 

मुझे लगता है कि लोड करने के लिए प्रयास करते हैं:
मेरे समस्या यह है कि मैं HTML से एक XmlDocument नहीं बना सकते, लोड (स्ट्रिंग यूआरएल) का उपयोग कर तो काम नहीं किया मैं का उपयोग कर एक स्ट्रिंग के लिए एचटीएमएल डाउनलोड किया है LoadXml (स्ट्रिंग xml) का उपयोग करते हुए मैं अपवाद मिल स्ट्रिंग

'--' is an unexpected token. The expected token is '>' 

क्या तरह से मैं एक parsable एक्सएमएल के लिए html फ़ाइल को पढ़ने के लिए ले जाना चाहिए

+5

एचटीएमएल जरूरी एक वैध होने की जरूरत नहीं एक्सएमएल। एचटीएमएल एसजीएमएल पर आधारित है, जो स्वयं एक्सएमएल का एक सुपरसेट (प्रकार) है। इसलिए आपको एक विशेष HTML पार्सर की आवश्यकता है, न कि एक सामान्य एक्सएमएल पार्सर। –

+0

नीचे दिए गए उत्तरों में से अधिक और ऊपर टिप्पणी करें। एचटीएमएल एक्सएमएल –

उत्तर

12

एचटीएमएल बस एक्सएमएल के समान नहीं है (जब तक कि एचटीएमएल वास्तव में एक्सएचटीएमएल या एचटीएमएल 5 अनुरूप होना होता है एक्सएमएल मोड में)। HTML पढ़ने के लिए HTML parser का उपयोग करने का सबसे अच्छा तरीका है। इसके बाद आप इसे लिंक से एक्सएमएल में बदल सकते हैं - या इसे सीधे संसाधित कर सकते हैं।

3

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

एचटीएमएल के साथ काम करने के लिए, आपको एक HTML पार्सर का उपयोग करने की आवश्यकता है।

+0

नहीं है यदि मैं दो उत्तरों को चिह्नित कर सकता हूं तो मैं आपके दोनों उत्तरों को चिह्नित करूंगा। – Ziv

0

यदि आप उन नोड्स को जानते हैं जिन्हें आप रुचि रखते हैं तो मैं स्ट्रिंग से लिंक निकालने के लिए रेगेक्स का उपयोग करूंगा।

+6

नियमित अभिव्यक्तियां एचटीएमएल या एक्सएमएल –

+1

को पार्स करने के लिए लगभग समझदार दृष्टिकोण नहीं हैं मैंने इसके बारे में सोचा है, लेकिन मैंने कभी भी रेगेक्स नहीं सीखा और यह एक छोटे से काम के लिए सीखने के लिए एक विषय का बहुत बड़ा है। – Ziv

+1

https://stackoverflow.com/a/1732454/321973 –

9

मैंने इसे स्वयं नहीं उपयोग किया है, लेकिन मेरा सुझाव है कि आप SGMLReader पर एक नज़र डालें।

XmlDocument FromHtml(TextReader reader) { 

    // setup SgmlReader 
    Sgml.SgmlReader sgmlReader = new Sgml.SgmlReader(); 
    sgmlReader.DocType = "HTML"; 
    sgmlReader.WhitespaceHandling = WhitespaceHandling.All; 
    sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower; 
    sgmlReader.InputStream = reader; 

    // create document 
    XmlDocument doc = new XmlDocument(); 
    doc.PreserveWhitespace = true; 
    doc.XmlResolver = null; 
    doc.Load(sgmlReader); 
    return doc; 
} 
+0

+1 मैंने कई वर्षों तक एसजीएमएल रीडर का उपयोग किया है (क्योंकि इसे पेश किया गया था)। यह बहुत मजबूत है और कुछ बहुत सड़े हुए विकृत HTML को संभाल सकता है। –

1

आप एक पृष्ठ से कुछ लिंक निकालने के लिए चाहते हैं, के रूप में आप उल्लेख किया है, HTML Agility Pack का उपयोग करके देखें: यहाँ अपने मुख पृष्ठ से एक नमूना है।

इस कोड को वेब से एक पृष्ठ हो जाता है और सभी लिंक निकालता है:

HtmlWeb web = new HtmlWeb(); 
HtmlDocument document = web.Load("http://www.stackoverflow.com"); 
HtmlNode[] links = document.DocumentNode.SelectNodes("//a").ToArray(); 

ओपन डिस्क से एक HTML फ़ाइल और विशिष्ट लिंक के लिए URL प्राप्त:

HtmlDocument document2 = new HtmlDocument(); 
document2.Load(@"C:\Temp\page.html") 
HtmlNode link = document2.DocumentNode.SelectSingleNode("//a[@id='myLink']"); 
Console.WriteLine(link.Attributes["href"].Value); 
संबंधित मुद्दे