Wie analysieren Sie eine HTML-Zeichenfolge für Image-Tags an den SRC Informationen zu bekommen?

StackOverflow https://stackoverflow.com/questions/138839

  •  02-07-2019
  •  | 
  •  

Frage

Zur Zeit verwende ich .Net WebBrowser.Document.Images() dies zu tun. Es erfordert die Webrowser das Dokument zu laden. Es ist chaotisch und Ressourcen in Anspruch nimmt.

Nach XPath ist besser als ein regex das an.

Wer weiß, wie dies in C # tun?

War es hilfreich?

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

ursprünglichen Blog-Beitrag

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");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top