Comment analyser une chaîne HTML pour que les balises image obtiennent les informations SRC?

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

  •  02-07-2019
  •  | 
  •  

Question

Actuellement, j'utilise .Net WebBrowser.Document.Images () pour cela. Il nécessite le Webrowser pour charger le document. C'est désordonné et prend des ressources.

Selon cette question XPath vaut mieux qu’une regex à cela.

Quelqu'un sait comment faire cela en C #?

Était-ce utile?

La solution

Si votre chaîne d'entrée est un fichier XHTML valide, vous pouvez le traiter comme du xml, le charger dans un xmldocument et utiliser la magie XPath :) Mais ce n'est pas toujours le cas.

Sinon, vous pouvez essayer cette fonction, qui renverra tous les liens d’image depuis 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;
}

Et vous pouvez l'utiliser comme ceci:

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

Autres conseils

Le gros problème de toute analyse HTML est le "bien formé". partie. Vous avez vu la merde HTML là-bas - combien est-il vraiment bien formé? J'avais besoin de faire quelque chose de similaire - analyser tous les liens d'un document (et dans mon cas) les mettre à jour avec un lien réécrit. J'ai trouvé le Pack d'agilité HTML sur CodePlex. Il bascule (et gère le code HTML mal formé).

Voici un extrait pour parcourir des liens dans un document:

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

Article de blog original

Si tout ce dont vous avez besoin, ce sont des images, je voudrais simplement utiliser une expression régulière. Quelque chose comme ça devrait faire l'affaire:

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

S'il s'agit d'un xhtml valide, vous pouvez le faire:

XmlDocument doc = new XmlDocument();
doc.LoadXml(html);
XmlNodeList results = doc.SelectNodes("//img/@src");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top