HtmlAgilityPack 일부 태그 사이에서 HTML을 추출하는 방법

c# html-agility-pack

문제

한 HTML에서 모든 단락을 추출하고 그 태그 사이의 모든 텍스트도 추출해야합니다.

이 코드는 HtmlDocument로 파싱 된 텍스트가 원래 텍스트에서 변경 될 때 작동하지 않습니다. 샘플에서

some <br />text

에서 변경되었습니다.

some <br>text

es :

string s = "<p>firt paragraph</p>some <br />text<p>another paragraph</p><span>some text between span</span><p>hellow word</p>";
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(s);
var nodes = doc.DocumentNode.SelectNodes("//p");
int lastPos = -1;
foreach (HtmlAgilityPack.HtmlNode n in nodes)
{
  if (lastPos > -1)
  {
      string textNotInP = Doc.DocumentNode.OuterHtml.Substring(lastPos, n.StreamPosition - lastPos);
                System.Diagnostics.Debug.WriteLine(textNotInP);
 }
 System.Diagnostics.Debug.WriteLine(n.OuterHtml);
 lastPos = n.StreamPosition + n.OuterHtml.Length;
}

올바른 결과는 다음과 같습니다.

<p>firt paragraph</p>
some <br>text
<p>second paragraph</p>
<span>some text between span</span>
<p>third paragraph</p>

위의 코드는이를 반환합니다.

<p>firt paragraph</p>
some <br>text<p
<p>second paragraph</p>
pan>some text between span</span><p
<p>third paragraph</p>

그 이유는 steamPosition이 htmlDocument에있는 parserd가 아니라 원래 텍스트와 관련된 노드 위치를 반환하기 때문입니다.

파싱 ​​된 html과 관련된 한 노드의 위치를 ​​반환하는 방법이 있습니까?

수락 된 답변

<p> 요소의 OuterHtml 속성을 사용하여 원하는 HTML을 얻을 수 있습니다.

string s = "<p>firt paragraph</p>some <br />text<p>another paragraph</p><span>some text between span</span><p>hellow word</p>";
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(s);
var nodes = doc.DocumentNode.SelectNodes("//p");
foreach (var item in nodes)
{
    Console.WriteLine(item.OuterHtml);
}

출력 :

<p>firt paragraph</p>
<p>another paragraph</p>
<p>hellow word</p>

첫 번째 사이에 모든 것을 얻을 것을 의미하는 경우 또는 <p> 마지막 <p> 요소는, 포함, 다음과 같은 XPath를 사용할 수 있습니다 :

var query = "//node()[preceding-sibling::p or self::p][following-sibling::p or self::p]";

는 XPath 잡아 모든 노드 (요소 또는 텍스트 노드 중 하나) 그 : 형제 앞에 한 p 과 형제 자매 다음 p , 또는 노드 자체는입니다 p 요소입니다.

var nodes = doc.DocumentNode.SelectNodes(query);
foreach (var item in nodes)
{
    Console.WriteLine(item.OuterHtml);
}

출력 :

<p>firt paragraph</p>
some
<br />
text
<p>another paragraph</p>
<span>some text between span</span>
<p>hellow word</p>


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