HtmlAgilityPack - 특정 테이블을 읽는 방법 - C # 4.0

c# html-agility-pack

문제

C # 4.0과 htmlagilitypack을 사용하면 어떻게 특정 테이블의 값을 읽을 수 있습니까? 제 말은 10 개의 테이블이 있고 6 번째 값을 읽거나 테이블 ID를 갖고 싶다는 뜻입니다.

또는 내가 특정 td 후에 오는 td 값을 읽고 싶다고 말할 수 있습니다.

또는 특정 div 또는 요소 또는 텍스트 뒤에 오는 테이블. 가능한가요?

수락 된 답변

당신이 요구 한 모든 것은 비교적 쉽게 이루어질 수 있습니다. 설명서가 부족할 수도 있습니다. XML 및 네트워크의 XmlDocument 구현과 사용 및 기능면에서 유사해야합니다.

특정 테이블에서 값을 읽으려면 어떻게해야합니까? 10 개의 테이블이 있고 6 번째 값을 읽거나 테이블 ID를 갖고 싶다고 가정 해 봅시다.

6 번째 테이블 찾기 :

// XPath
var table6 = doc.DocumentNode.SelectSingleNode("//table[6]");

// LINQ
var table6 = doc.DocumentNode.Descendants("table").Skip(5).FirstOrDefault();

ID로 테이블 / 요소 찾기 :

var myTable = doc.GetElementById("myTable");

// XPath
var myTable = doc.DocumentNode.SelectSingleNode("//table[@id='myTable']");
var myTable = doc.DocumentNode.SelectSingleNode("//*[@id='myTable']");

// LINQ
var myTable = doc.DocumentNode
    .Descendants("table")
    .Where(table => table.Attributes.Contains("id"))
    .SingleOrDefault(table => table.Attributes["id"].Value == "myTable");
var myTable = doc.DocumentNode
    .Descendants()
    .Where(e => e.Attributes.Contains("id"))
    .SingleOrDefault(e => e.Attributes["id"].Value == "myTable");
var myTable = doc.DocumentNode
    .Descendants("table")
    .SingleOrDefault(table => table.GetAttributeValue("id", null) == "myTable");
var myTable = doc.DocumentNode
    .Descendants()
    .SingleOrDefault(e => e.GetAttributeValue("id", null) == "myTable");

특정 td 후에 오는 td 값을 읽고 싶다고 가정 해 봅시다.

// XPath
var certainTd = table6.SelectSingleNode("//td[2]");
var tdAfterCertainTd = certainTd.SelectSingleNode("following-sibling::td[1]");

// LINQ (not so easy)
var certainTd = table6.Descendants("td").Skip(1).FirstOrDefault();
var tdAfterCertainTd = certainTd.NextSibling;
while (tdAfterCertainTd != null)
{
    if (tdAfterCertainTd.Name == "td")
        break;
    tdAfterCertainTd = tdAfterCertainTd.NextSibling;
}

특정 div 나 요소 또는 텍스트 뒤에 오는 표.

// XPath
var certainDiv = doc.DocumentNode.SelectSingleNode("//div[1]");
var tableAfterCertainDiv = certainDiv.SelectSingleNode("following-sibling::table[1]");

// LINQ (not so easy)
var certainDiv = doc.DocumentNode.Descendants("div").FirstOrDefault();
var tableAfterCertainDiv = certainDiv.NextSibling;
while (tableAfterCertainDiv != null)
{
    if (tableAfterCertainDiv.Name == "table")
        break;
    tableAfterCertainDiv = tableAfterCertainDiv.NextSibling;
}

몇 가지 패턴을 알아야합니다.




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