我们如何解析图像标签的HTML字符串以获取SRC信息?
时间:2020-03-06 14:46:42 来源:igfitidea点击:
目前,我使用.NetWebBrowser.Document.Images()
来做到这一点。它需要Webrowser加载文档。这很麻烦,并且占用了资源。
根据这个问题,XPath在这方面胜过正则表达式。
有人知道如何在C#中执行此操作吗?
解决方案
如果它是有效的xhtml,则可以执行以下操作:
XmlDocument doc = new XmlDocument(); doc.LoadXml(html); XmlNodeList results = doc.SelectNodes("//img/@src");
如果我们只需要图像,我将使用正则表达式。这样的事情应该可以解决问题:
Regex rg = new Regex(@"<img.*?src=""(.*?)""", RegexOptions.IgnoreCase);
如果我们输入的字符串是有效的XHTML,则可以将其视为xml,将其加载到xmldocument中,然后执行XPath magic :),但并非总是如此。
否则,我们可以尝试使用此功能,该功能将从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; }
我们可以像这样使用它:
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()); } }
HTML解析的最大问题是"格式正确"的部分。我们已经看到了废话HTML,其中有多少真的格式正确?我需要执行类似的操作以解析出文档中的所有链接(以我为例),并使用重写的链接对其进行更新。我在CodePlex上找到了Html Agility Pack。它会摇摆(并处理格式错误的HTML)。
这是用于遍历文档中链接的摘要:
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 } }
原始博客文章