使用HTML敏捷包关联相邻元素值

本文关键字:元素 关联 HTML 包关联 使用 | 更新日期: 2023-09-27 18:03:30

我试图抓取HTML注释后面的h2元素,文本"Results",然后是类名"stockfeed"的表元素。

我已经弄清楚如何拉我需要的数据(见下面),但我不确定如何在同一时间拉2个元素在一起。我知道我可以使用相同的索引器迭代集合来关联值,但这似乎容易出错,因为我的h2元素之一可能没有相邻的表元素(罕见但可能)。

HTML标记示例:

<h1>
    Results Page</h1>
<h2>
    Updated Daily @ 10:00 AM</h2>
<div class='someClass1'>
    <!-- Results -->
    <div class='something'>
    </div>
    <h2 style='display: inline;'>
        <a href='http://www.somesite.com'>Table 1</a>
    </h2>
    <div class='clr'>
    </div>
    <div class='resultBlock'>
        <table class='stockfeed'>
            <thead>
                <tr>
                    <th>
                        Part
                    </th>
                    <th>
                        Description
                    </th>
                    <th>
                        Stock
                    </th>
                    <th>
                        Price
                    </th>
                </tr>
            </thead>
            <tbody>
                <tr class='row1' valign='top'>
                    <td>
                        A 1234567890
                    </td>
                    <td class='description'>
                        Part Description
                    </td>
                    <td>
                        1,000,000
                    </td>
                    <td>
                        $1.99
                    </td>
                </tr>
                <tr class='row1' valign='top'>
                    <td>
                        B 1234567890
                    </td>
                    <td class='description'>
                        Part Description
                    </td>
                    <td>
                        1,000,000
                    </td>
                    <td>
                        $1.99
                    </td>
                </tr>
                <tr class='row1' valign='top'>
                    <td>
                        C 1234567890
                    </td>
                    <td class='description'>
                        Part Description
                    </td>
                    <td>
                        1,000,000
                    </td>
                    <td>
                        $1.99
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
    <!-- Results -->
    <div class='something'>
    </div>
    <h2 style='display: inline;'>
        <a href='http://www.somesite.com'>Table 2</a>
    </h2>
    <div class='clr'>
    </div>
    <div class='resultBlock'>
        <table class='stockfeed'>
            <thead>
                <tr>
                    <th>
                        Part
                    </th>
                    <th>
                        Description
                    </th>
                    <th>
                        Stock
                    </th>
                    <th>
                        Price
                    </th>
                </tr>
            </thead>
            <tbody>
                <tr class='row1' valign='top'>
                    <td>
                        A 1234567890
                    </td>
                    <td class='description'>
                        Part Description
                    </td>
                    <td>
                        1,000,000
                    </td>
                    <td>
                        $1.99
                    </td>
                </tr>
                <tr class='row1' valign='top'>
                    <td>
                        B 1234567890
                    </td>
                    <td class='description'>
                        Part Description
                    </td>
                    <td>
                        1,000,000
                    </td>
                    <td>
                        $1.99
                    </td>
                </tr>
                <tr class='row1' valign='top'>
                    <td>
                        C 1234567890
                    </td>
                    <td class='description'>
                        Part Description
                    </td>
                    <td>
                        1,000,000
                    </td>
                    <td>
                        $1.99
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
</div>

分别解析值的当前代码:

    HtmlNodeCollection titles = doc.DocumentNode.SelectNodes("//comment()[contains(.,'Results')]/following-sibling::h2");
    for (int tit = 0; tit < titles.Count; ++tit)
    {
        // Do Something
    }
    HtmlNodeCollection tables = doc.DocumentNode.SelectNodes("//table[@class='stockfeed']");
    for (int tab = 0; tab < tables.Count; ++tab)
    {
        // Do Something
    }

使用HTML敏捷包关联相邻元素值

因此,如果我正确阅读这篇文章,您正试图获得每个结果的相应表。

您可以使用与获取以下h2元素类似的方法来获取与其相关的以下table元素。

var query = doc.DocumentNode
    .SelectNodes("//comment()[contains(.,'Results')]/following-sibling::h2");
foreach (var h2 in query.Cast<HtmlNode>())
{
    var table = h2.SelectSingleNode("following-sibling::*/table[@class='stockfeed']");
    // do stuff with h2 and table
}