C # Html 민첩성 팩 여러 대안으로 태그를 구문 분석

c# html html-agility-pack tags

문제

HTML에 대한 경험이 없으므로 잘못된 용어를 사용하십시오.

HTML 민첩성 팩을 사용하여 HTML 문서를 구문 분석하려고하는데 매우 구체적인 문자열을 찾고 있습니다.

나는 모든 형태의 문자열을 얻고 싶다.

<img src="..." etc=....">

그래서 선택 매개 변수는

HtmlNodeCollection images = doc.DocumentNode.SelectNodes("//img[@src]");

그러나 이것은 또한 다음과 같은 문자열을 반환합니다.

<img width="..." src="..." etc="..">

필자는 (적어도 필자가 아는 한) img 태그가 검색되었으며 src는 img 태그 바로 옆에있는 것이 아니라 동일한 레벨에서 찾을 필요가 있다고 생각합니다.

설명서를 살펴본 후에 나는이 기능을 사용할 수없는 무언가를하려고하고 있다고 느낍니다.

누군가가 이것을 올바른 방법으로 제안 할 수 있습니까? 감사!

수락 된 답변

" img 태그가 검색되고 src 는 img 태그 바로 옆에 있지 않아도 같은 레벨에서 찾을 필요가 있습니다. "

src 속성이 첫 번째 속성 인 <img> 요소를 찾고 싶습니다. XML / HTML 파서는 속성 순서를 유지할 필요가 없으므로 일반적으로 특정 속성 순서, 즉 src 속성이 먼저 오는 위치 등을 기준으로 요소를 선택하기를 원하지 않습니다.

어쨌든, 과도하게 구체화 된 테스트에서 HAP에 의해 속성 순서가 유지되므로 Attributes[0].Name *을 사용하여 작업 한 첫 번째 속성의 이름을 확인하십시오.

var raw = @"<div>
    <img src=""..."" etc=""...."">
    <img width=""..."" src=""..."" etc="".."">
    <img>
</div>";
var doc = new HtmlDocument();
doc.LoadHtml(raw);
var result = doc.DocumentNode
                .SelectNodes("//img[@src]")
                .Where(o => o.Attributes[0].Name == "src")
                .ToList();
foreach (var item in result)
{
    Console.WriteLine(item.OuterHtml);
}

출력 :

<img src="..." etc="....">

*) XPath는 이미 src 라는 속성을 가진 img 요소를 필터링하기 때문에 Attributes[0].Name 은 NRE를 생성하지 않습니다.


인기 답변

나는 XPATH에 익숙하지 않아서 네가 맞다고 생각한다. (보통 나는 HtmlAgilityPack 외에 ScrapySharp 라이브러리를 사용하는 CSS 선택자를 사용한다.)

다음 콘솔 프로젝트 코드 스 니펫은 원하는 img 노드, 즉 2 개의 속성 만있는 src (예 : src 및 etc)를 리턴합니다. 다음과 같이 3 개의 이미지 노드가있는 샘플 HTML을 수동으로로드합니다.

        HtmlDocument doc = new HtmlDocument();
        string html = @"
            <img src='img1.jpg' />
            <img src='img1.jpg' etc='etcValue' />
            <img width='200px' src='img1.jpg' />
        ";
        doc.LoadHtml(html);

        var relevantImgNodes = doc.DocumentNode.SelectNodes("//img")
            .Where(n => 
                n.Attributes.Count == 2 && 
                !string.IsNullOrEmpty(n.GetAttributeValue("src")) && 
                !string.IsNullOrEmpty(n.GetAttributeValue("etc")));

        Console.WriteLine(relevantImgNodes.Count()); // prints 1


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.