다음 HTML이 있다고 가정 해 보겠습니다.
<p id="definition">
<span class="hw">emolument</span> \ih-MOL-yuh-muhnt\, <i>noun</i>:
The wages or perquisites arising from office, employment, or labor
</p>
C #에서 HTMLAgilityPack을 사용하여 각 파트를 개별적으로 추출하려고합니다.
나는 쉽게 단어와 단어 수업을받을 수있다.
var definition = doc.DocumentNode.Descendants()
.Where(x => x.Name == "p" && x.Attributes["id"] == "definition")
.FirstOrDefault();
string word = definition.Descendants()
.Where(x => x.Name == "span")
.FirstOrDefault().InnerText;
string word_class = definition.Descendants()
.Where(x => x.Name == "i")
.FirstOrDefault().InnerText;
하지만 어떻게 발음이나 실제 정의를 얻을 수 있습니까? 이러한 노드 사이의 가을, 그리고 내가 defintion.InnerText
사용하면 한 문자열에 전체 많이 얻을. XPath
에서이를 수행 할 수있는 방법이 있습니까?
HtmlAgilityPack에서 노드 사이의 텍스트는 어떻게 선택합니까?
XPath에서이를 수행 할 수있는 방법이 있습니까?
예 - 아주 쉬운 것입니다.
이해해야 할 핵심 개념은 텍스트 노드와 자식 요소 노드가 XML / HTML로 구성되는 방식이며 따라서 XPath로 구성됩니다.
요소의 텍스트 내용이 자식 요소에 의해 강조 표시되면 개별 텍스트 노드로 끝납니다. 위치에 따라 개별 텍스트 노드에 액세스 할 수 있습니다.
모든 요소에서 text()
를 사용하면 모든 하위 텍스트 노드가 검색됩니다. 표시 한 스 니펫에 //p/text()
를 적용하면 각 결과가 -------
구분됩니다.
[EMPTY TEXT NODE, EXCEPT WHITESPACE]
-----------------------
\ih-MOL-yuh-muhnt\,
-----------------------
:
The wages or perquisites arising from office, employment, or labor
이 p
요소의 첫 번째 텍스트 노드는 공백 만 포함하므로 아마도 여러분이 겪은 것이 아닙니다. //p/text()[2]
가져 오기
\ih-MOL-yuh-muhnt\,
//p/text()[3]
:
:
The wages or perquisites arising from office, employment, or labor
HtmlNode text = doc.DocumentNode.Descendants().Where(x => x.Name == "p" && x.Id == "definition").FirstOrDefault();
foreach (HtmlNode node in text.SelectNodes(".//text()"))
{
Console.WriteLine(node.InnerText.Trim());
}
출력은 다음과 같습니다.
2. \ih-MOL-yuh-muhnt\,
결과. 니가 필요해.
HtmlNode a = text.SelectNodes(".//text()[2]").FirstOrDefault();