HtmlAgilityPack (Linq)을 사용하여 html 테이블 구문 분석

html-agility-pack html-table linq

문제

다음은 테이블 구조입니다.

<table class="tb-stock tb-option">
<tr>
    <th class="bgc2">col1</th>
    <th class="bgc2">col2</th>
    <th class="bgc2">col3</th>
</tr>
<tr class="alt-row">
    <th class="">2018/1/29</th>
    <td class="">0.11</td>
    <td class=" b-b">0.50</td>
</tr>
<tr class="alt-row">
    <th class="">2018/1/30</th>
    <td class="">0.22</td>
    <td class=" b-b">0.55</td>
</tr>
</table>

나는 "tr"( "th"와 "td"를 포함하여) 아래에있는 모든 요소를 ​​얻고 싶습니다.

어떻게 이것을 달성하기 위해 linq를 사용할 수 있습니까?

문제는 "..tr.Elements ("td | th ") .."

암호:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.Load(ms, Encoding.UTF8);

List<List<string>> table = 
doc.DocumentNode.SelectSingleNode("//table[@class='tb-stock tb-option']")
                .Descendants("tr")
                .Skip(1)
                .Where(tr => tr.Elements("th").Count() >= 1)
                .Select(tr => tr.Elements("td|th").Select(td => td.InnerText).ToList())
                .ToList();

수락 된 답변

다음 코드를 사용하여 td 또는 th 요소의 내부 텍스트를 추출 할 수 있습니다. 로컬에서 출력을 테스트합니다.

2018/1/29
0.11
0.50
2018/1/30
0.22
0.55

다음 줄에서 요소를 필터링 할 수 있습니다.

// both td and th
.Where(node => "td|th".Contains(node.Name))
// only td
.Where(node => "td".Contains(node.Name))

작업 코드는 다음과 같습니다.

HtmlDocument doc = new HtmlDocument();
doc.Load("test.html", Encoding.UTF8);

List<string> table =
doc.DocumentNode.SelectSingleNode("//table[@class='tb-stock tb-option']")
    .Descendants("tr")
    .Skip(1)
    .Where(tr => tr.Elements("th").Count() >= 1)
    .SelectMany(tr => tr.ChildNodes)
    .Where(node => "td|th".Contains(node.Name))
    .Select(node => node.InnerText)
    .ToList();

foreach (var str in table)
{
    Console.WriteLine(str);
}


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