SRC 정보를 얻기 위해 이미지 태그를 위해 HTML 문자열을 어떻게 구문 분석합니까?

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

  •  02-07-2019
  •  | 
  •  

문제

현재 .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");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top