Como você analisar uma string HTML para as tags de imagem para obter a informação SRC?

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Atualmente eu uso .Net WebBrowser.Document.Images() para fazer isso. Ela exige que o Webrowser para carregar o documento. É confuso e ocupa recursos.

De acordo com a esta questão XPath é melhor do que um regex para isso.

Alguém sabe como fazer isso em C #?

Foi útil?

Solução

Se a sua cadeia de entrada é XHTML você pode tratar é como xml, carregá-lo em um XmlDocument, e fazer XPath mágica :) Mas nem sempre é o caso.

Caso contrário, você pode tentar esta função, que irá retornar todas as ligações da imagem de 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;
}

E você pode usá-lo como este:

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

Outras dicas

O grande problema com qualquer análise de HTML é a parte "bem formado". Você viu o HTML porcaria lá fora - como muito do que é realmente bem formado? Eu precisava fazer algo semelhante - parse out todos os links em um documento (e no meu caso) atualizá-los com um link reescrito. Achei o Html agilidade Pacote sobre no CodePlex. Balança (e alças mal formado HTML).

Aqui está um trecho de iteração sobre links em um documento:

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

Blog Original Publicar

Se tudo que você precisa é de imagens que eu só iria usar uma expressão regular. Algo como isso deve fazer o truque:

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

Se é xhtml válido, você poderia fazer isso:

XmlDocument doc = new XmlDocument();
doc.LoadXml(html);
XmlNodeList results = doc.SelectNodes("//img/@src");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top