Wie analysieren Sie eine HTML-Zeichenfolge für Image-Tags an den SRC Informationen zu bekommen?
Lösung
Wenn Sie Ihre Eingabe-String ist gültiges XHTML können Sie als XML behandeln, es in ein XmlDocument laden, und tun XPath Magie :) Aber es ist nicht immer der Fall ist.
Ansonsten können Sie diese Funktion versuchen, das alle Bild-Links von HtmlSource zurück:
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;
}
Und Sie können es wie folgt verwendet werden:
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());
}
}
Andere Tipps
Das große Problem mit einer beliebigen HTML-Analyse ist die „gut ausgebildet“ -Teil. Sie haben dort den Mist HTML gesehen - wie viel davon wirklich gut ausgebildet ist? Ich brauchte etwas ähnliches zu tun - analysieren, alle Links in einem Dokument (und in meinem Fall) aktualisieren, um sie mit einem neu geschrieben Link. Ich fand die Html Agility-Pack auf CodePlex über. Es schaukelt (und Griffe ungültige HTML).
Hier ist ein Ausschnitt in einem Dokument über Links Iterieren:
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
}
}
Wenn Sie nur Bilder brauchen würde ich nur einen regulären Ausdruck. So etwas sollte es tun:
Regex rg = new Regex(@"<img.*?src=""(.*?)""", RegexOptions.IgnoreCase);
Wenn es valid xhtml ist, könnten Sie dies tun:
XmlDocument doc = new XmlDocument();
doc.LoadXml(html);
XmlNodeList results = doc.SelectNodes("//img/@src");