目前我使用.Net WebBrowser.Document.Images()
来做到这一点.它需要Webrowser
加载文档.它很乱,占用资源.
根据这个问题, XPath优于正则表达式.
任何人都知道如何在C#中做到这一点?
如果您的输入字符串是有效的XHTML,您可以将其视为xml,将其加载到xmldocument中,并执行XPath魔法:)但情况并非总是如此.
否则你可以尝试这个函数,它将返回来自HtmlSource的所有图像链接:
public ListFetchLinksFromSource(string htmlSource) { List links = new List (); string regexImgSrc = @"]*?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())) { Listlinks = 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 } }
原博客文章