SRC 정보를 얻기 위해 이미지 태그를 위해 HTML 문자열을 어떻게 구문 분석합니까?
문제
현재 .NET을 사용합니다 WebBrowser.Document.Images()
이것을하기 위해. 필요합니다 Webrowser
문서를로드합니다. 지저분하고 자원을 차지합니다.
에 따르면 이 질문 XPath는 이것에 대한 정규식보다 낫습니다.
누구든지 C#에서이 작업을 수행하는 방법을 알고 있습니까?
해결책
입력 문자열이 유효한 XHTML 인 경우 처리 할 수있는 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을 보았습니다. 얼마나 많은 것이 잘 형성됩니까? 비슷한 작업을 수행해야했습니다. 문서의 모든 링크를 구문 분석 (및 내 경우) 다시 작성한 링크로 업데이트해야합니다. 나는 찾았다 HTML 민첩성 팩 CodePlex에서. 그것은 바위 (그리고 기형 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
}
}
필요한 것은 이미지 만 있으면 정규 표현식 만 사용합니다. 이와 같은 것은 트릭을 수행해야합니다.
Regex rg = new Regex(@"<img.*?src=""(.*?)""", RegexOptions.IgnoreCase);
유효한 XHTML 인 경우 다음을 수행 할 수 있습니다.
XmlDocument doc = new XmlDocument();
doc.LoadXml(html);
XmlNodeList results = doc.SelectNodes("//img/@src");
제휴하지 않습니다 StackOverflow