Html Agility Pack을 사용하고 문제가 발생하면 처음입니다.
내 제목이 암시하는 것처럼 내부 요소를 포함한 문자열로 전체 요소를 가져 오려고합니다.
그래서 아래 예를 들어 내 html이고 id aspnetForm
양식 요소를 찾고 있는데요.
<html>
<head>
</head>
<body>
<form name="aspnetForm" id="aspnetForm">
<div id="div1">
<a href="div1-a1">Link 1 inside div1</a>
<a href="div1-a2">Link 2 inside div1</a>
</div>
<a href="a3">Link 3 outside all divs</a>
<div id="div2">
<a href="div2-a1">Link 1 inside div2</a>
<a href="div2-a2">Link 2 inside div2</a>
</div>
</form>
</body>
</html>
나는 다음을 출력으로 (문자열 내에서) 원한다.
<form name="aspnetForm" id="aspnetForm">
<div id="div1">
<a href="div1-a1">Link 1 inside div1</a>
<a href="div1-a2">Link 2 inside div1</a>
</div>
<a href="a3">Link 3 outside all divs</a>
<div id="div2">
<a href="div2-a1">Link 1 inside div2</a>
<a href="div2-a2">Link 2 inside div2</a>
</div>
</form>
나는 보통 그런 숟가락 먹이는 질문을하는 것을 좋아하지 않는다. 그러나 나는 시험해보고 있었다. 그러나 couldnt는 대답을 얻는다.
도와주세요!
미리 감사드립니다!
HtmlNode.OuterHtml
찾고있는 것 같습니다.
//
// Summary:
// Gets or Sets the object and its content in HTML.
public virtual string OuterHtml { get; }
따라서 폼 노드를 선택하고 OuterHtml 속성을 가져와야합니다.
HtmlDocument doc = ... // load your HTML
HtmlNode formNode = doc.DocumentNode.SelectSingleNode("//form[@id='aspnetForm']");
string entireElementAsString = formNode.OuterHtml;
최신 정보
HAP이 form
태그를 처리하는 방법에 아주 오래된 버그 가있는 것 같습니다. 아니면 기능 일 수도 있습니다 !
어쨌든 다음과 같은 해결 방법이 있습니다.
HtmlNode.ElementsFlags.Remove("form");
그래서 이것은 작동해야합니다 :
HtmlNode.ElementsFlags.Remove("form");
HtmlDocument doc = ... // load your HTML
HtmlNode formNode = doc.DocumentNode.SelectSingleNode("//form[@id='aspnetForm']");
string entireElementAsString = formNode.OuterHtml;
정말로 좋은 질문, 다음과 같은 모든 것이 이상하게도 이상합니다!
HtmlAgilityPack 사용 - 아직 솔루션을 찾을 수 없습니다!
(내가 CSS 선택기 확장 (ScrapySharp.Extensions)을 얻으려면뿐만 아니라, 너겟 라이브러리 ScraySharp를 사용하여,
string html = @"<html>
<head>
</head>
<body>
<form name='aspnetForm' id='aspnetForm'>
<div id='div1'>
<a href='div1-a1'>Link 1 inside div1</a>
<a href='div1-a2'>Link 2 inside div1</a>
</div>
<a href='a3'>Link 3 outside all divs</a>
<div id='div2'>
<a href='div2-a1'>Link 1 inside div2</a>
<a href='div2-a2'>Link 2 inside div2</a>
</div>
</form>
</body>
</html>";
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
string result = string.Empty;
var formElement = doc.DocumentNode.CssSelect("form").FirstOrDefault();
var formChildren = formElement.Descendants();
StringBuilder sb = new StringBuilder();
if (formChildren != null)
{
foreach (var child in formChildren)
{
sb.AppendLine(child.InnerHtml);
}
}
//formElement.InnerHtml also returns empty !
Console.WriteLine(sb.ToString());
그러나 AngleSharp를 사용하면 쉽게 달성 할 수 있습니다 (HtmlAgility Pack이 아닌 반면 아직까지 유지 관리 / 개발 되었기 때문에 요즘에는 권장 각도 옵션이 좋습니다).
AngleSharp 사용 - 작동
HtmlParser parser = new HtmlParser();
var parsedDoc = parser.Parse(html);
Console.WriteLine(parsedDoc.QuerySelector("form").InnerHtml);
출력 (AngleSharp 사용) :