HTML 민첩성 팩으로 테이블 파싱

c# html-agility-pack html-table

문제

다음 HTML에서는 table 요소를 구문 분석 할 수 있지만 th 요소를 건너 뛸 수있는 방법을 모르겠습니다.

나는 td 요소 만 얻고 싶지만 사용하려고하면 :

foreach (HtmlNode cell in row.SelectNodes("td"))

... 예외가 생깁니다.

foreach (HtmlNode cell in row.SelectNodes("td"))

내 코드 :

foreach (HtmlNode cell in row.SelectNodes("td"))

수락 된 답변

이 메서드는 LINQ를 사용하여 이름이 td HtmlNode 인스턴스를 쿼리합니다.

나는 또한 당신의 결과가 val|val| (후행 파이프 사용),이 샘플에서는 string.Join(pipe, array) 을 사용하여 그 후행 파이프 val|val : val|val 을 제거하는 덜 string.Join(pipe, array) 방법으로 사용합니다.

using System.Linq;

// ...

var tablecollection = doc.DocumentNode.SelectNodes("//table");
string store = string.Empty;

if (tablecollection != null)
{
    foreach (HtmlNode table in tablecollection)
    {
        // For all rows with at least one child with the 'td' tag.
        foreach (HtmlNode row in table.DescendantNodes()
            .Where(desc =>
                desc.Name.Equals("tr", StringComparison.OrdinalIgnoreCase) &&
                desc.DescendantNodes().Any(child => child.Name.Equals("td",
                    StringComparison.OrdinalIgnoreCase))))
        {
            // Combine the child 'td' elements into an array, join with the pipe
            // to create the output in 'val|val|val' format.
            store = string.Join("|", row.DescendantNodes().Where(desc =>
                desc.Name.Equals("td", StringComparison.OrdinalIgnoreCase))
                .Select(desc => desc.InnerText));

            // You can probably get rid of the 'store' variable as it's
            // no longer necessary to store the value of the table's
            // cells over the iteration.
            sw.Write(store);
            sw.WriteLine();
        }
    }
}

sw.Flush();
sw.Close(); 

인기 답변

XPath 구문이 올바르지 않습니다. 시도하십시오 :

HtmlNode cell in row.SelectNodes("//td")

foreach 하여 반복 할 수있는 td 요소의 컬렉션을 얻을 수 있습니다.




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