2008-09-26 11 views

Odpowiedz

51

Jeżeli ciąg wejściowy jest zgodna z XHTML można traktować to jako xml, załaduj go do XmlDocument i wykonaj XPath magii :) Ale to nie zawsze jest prawdą.

przeciwnym razie można spróbować tej funkcji, która zwróci wszystkie linki graficzne z 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; 
} 

I można go używać tak:

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

Dzięki za to, waliłem głową o mój własny regex! –

+1

'([^ '" "] +?)' Nie działa, jeśli href zawiera spacje! – Ahmad

+0

Linia 'using (StreamReader sr = new StreamReader (response.GetResponseStream()) nie ma dodatkowego nawiasu zamykającego: – Kaitlyn

-3

Jeśli to ważne xhtml, można to zrobić:

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

Powodzenia ładowanie 90% stron tam w XmlDocument :) –

+0

html Już próbowałem. HTML nie jest prawidłowym kodem XML. I w ten sposób zgłasza wyjątek. –

+0

@RobertoBonini jesteś ekspertem! – Snickbrack

4

Jeśli wszystko czego potrzebujesz to obrazy chciałbym po prostu użyć wyrażenia regularnego. Coś jak to powinno załatwić sprawę:

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

Duży problem z dowolnym parsowania HTML jest "dobrze uformowana" część. Widziałeś już ten bzdurny HTML - ile z tego jest naprawdę dobrze uformowanych? Potrzebowałem czegoś podobnego - przeanalizuj wszystkie linki w dokumencie (w moim przypadku) zaktualizuj je za pomocą przepisanego linku. Znalazłem kod Html Agility Pack na CodePlex. Skałuje (i obsługuje zniekształcony HTML).

Oto urywek dla iteracji przez łącza w dokumencie:

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

Co to jest" Content "? –

Powiązane problemy