2008-09-26 3 views
23

वर्तमान में मैं ऐसा करने के लिए .Net WebBrowser.Document.Images() का उपयोग करता हूं। दस्तावेज़ को लोड करने के लिए Webrowser की आवश्यकता है। यह गन्दा है और संसाधन लेता है।एसआरसी जानकारी प्राप्त करने के लिए आप छवि टैग के लिए एक HTML स्ट्रिंग का विश्लेषण कैसे करते हैं?

this question के अनुसार XPath इस पर एक रेगेक्स से बेहतर है।

कोई भी जानता है कि सी # में ऐसा कैसे करें?

उत्तर

51

यदि आपका इनपुट स्ट्रिंग मान्य एक्सएचटीएमएल आप का इलाज कर सकते एक्सएमएल के रूप में है, एक XmlDocument में लोड है, और XPath जादू :) लेकिन यह हमेशा ऐसा नहीं है।

नहीं तो आप इस समारोह की कोशिश कर सकते हैं, कि HtmlSource से सभी छवि लिंक वापस आ जाएगी:

public List<Uri> FetchLinksFromSource(string htmlSource) 
{ 
    List<Uri> links = new List<Uri>(); 
    string regexImgSrc = @"<img[^>]*?src\s*=\s*[""']?([^'"" >]+?)[ '""][^>]*?>"; 
    MatchCollection matchesImgSrc = Regex.Matches(htmlSource, regexImgSrc, RegexOptions.IgnoreCase | RegexOptions.Singleline); 
    foreach (Match m in matchesImgSrc) 
    { 
     string href = m.Groups[1].Value; 
     links.Add(new Uri(href)); 
    } 
    return links; 
} 

और तुम इस तरह इसका इस्तेमाल कर सकते हैं:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.example.com"); 
request.Credentials = System.Net.CredentialCache.DefaultCredentials; 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
if (response.StatusCode == HttpStatusCode.OK) 
{ 
    using(StreamReader sr = new StreamReader(response.GetResponseStream())) 
    { 
     List<Uri> links = FetchLinksFromSource(sr.ReadToEnd()); 
    } 
} 
+0

इसके लिए धन्यवाद, मैं अपने सिर पर अपने सिर पर टक्कर लगी थी! –

+1

'([^ '" ">] +?) काम नहीं करता है अगर href में रिक्त स्थान शामिल हैं! – Ahmad

+0

'उपयोग (StreamReader sr = new StreamReader (response.GetResponseStream())' लाइन में एक अतिरिक्त समापन ब्रैकेट गुम है। – Kaitlyn

-3

अगर यह वैध एक्सएचटीएमएल है, तो आप ऐसा कर सकते हैं:

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(html); 
XmlNodeList results = doc.SelectNodes("//img/@src"); 
+0

गुड लक लोड हो रहा है वहाँ बाहर एक XmlDocument :) –

+0

में HTML पृष्ठों का 90% पहले से ही इस की कोशिश की। एचटीएमएल वैध एक्सएमएल नहीं है। और इस तरह एक अपवाद फेंकता है। –

+0

@ रॉबर्टोबोनिनी आप एक विशेषज्ञ हैं! – Snickbrack

4

तो आप सभी की जरूरत छवियों मैं सिर्फ रेगुलर एक्सप्रेशन का उपयोग होता है। कुछ इस तरह चाल करना चाहिए:

Regex rg = new Regex(@"<img.*?src=""(.*?)""", RegexOptions.IgnoreCase); 
10

किसी भी HTML पार्स के साथ बड़ी समस्या नहीं है "अच्छी तरह से गठित" हिस्सा। आपने वहां बकवास एचटीएमएल देखा है - इसमें से कितना वास्तव में अच्छी तरह से बनाया गया है? मुझे कुछ ऐसा करने की ज़रूरत थी - दस्तावेज़ में सभी लिंक को पार्स करें (और मेरे मामले में) उन्हें एक पुनर्लेखित लिंक के साथ अपडेट करें। मुझे कोडप्लेक्स पर Html Agility Pack मिल गया। यह चट्टानों (और विकृत एचटीएमएल संभालती है)।

यहाँ एक दस्तावेज़ में लिंक पर पुनरावृत्ति के लिए एक टुकड़ा है:

HtmlDocument doc = new HtmlDocument(); 
doc.Load(@"C:\Sample.HTM"); 
HtmlNodeCollection linkNodes = doc.DocumentNode.SelectNodes("//a/@href"); 

Content match = null; 

// Run only if there are links in the document. 
if (linkNodes != null) 
{ 
    foreach (HtmlNode linkNode in linkNodes) 
    { 
     HtmlAttribute attrib = linkNode.Attributes["href"]; 
     // Do whatever else you need here 
    } 
} 

Original Blog Post

+2

"सामग्री" क्या है? –

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

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