2008-09-26 14 views

cevap

51

senin girdi dizesi sen davranabilirsiniz geçerli XHTML bir XmlDocument yüklemek, xml gibidir, ve XPath büyü yapmak :) Ama her zaman böyle değil ise.

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; 
} 

Ve bu gibi kullanabilirsiniz:

Aksi takdirde HtmlSource tüm resim bağlantılarını dönecek, bu işlevi deneyebilirsiniz

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

Bunun için, başımı kendi regeximin üzerinde beceriyordum! –

+1

'([^ '" ">] +?)', Href boşluk içeriyorsa çalışmıyor! – Ahmad

+0

Kullanarak (StreamReader sr = yeni StreamReader (response.GetResponseStream()) satırında ek bir kapatma ayracı eksik – Kaitlyn

-3

, bunu yapabilirdi:

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

İyi orada bir XmlDocument :) –

+0

içine html sayfaları% 90 Zaten bu denedik. HTML geçerli bir XML değil. Ve böylece bir istisna atar. –

+0

@RobertoBonini bir uzman ol! – Snickbrack

4

tek ihtiyacınız sadece normal bir ifade kullanmak görüntüleri ise. Böyle bir şey hile yapmak gerekir:

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

herhangi bir HTML ayrıştırma ile büyük bir sorundur "iyi biçimlendirilmiş" kısmı. Bu bok HTML'yi orada gördünüz - gerçekten ne kadar iyi biçimlendirilmiş? Benzer bir şey yapmam gerekiyordu - bir belgenin tüm bağlantılarını ayrıştırmak (ve benim durumumda) bunları yeniden yazılan bir bağlantıyla günceller. CodePlex üzerinde Html Agility Pack'u buldum. Kayar (ve hatalı biçimlendirilmiş HTML'yi işler).

Burada bir belgede bağlantıları üzerinden yineleme için parçacık İşte:

şans yükleme
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

"İçerik" nedir? –