使用“Html Agility pack”選擇特定的html

c# html-agility-pack

我正在使用html-agility-pack並嘗試選擇其中的特定html。我想得的部分是這些塊中的每個GTIN編號:

<td><span class="mobile-only">GTIN:</span>07330155011068</td>

- 我想要的部分是結束span-tag之後的數字。例如:07330155011068。下面是我的html和我的c#-method:

<div class="table-wrapper" style='display: block;'>
    <table id="tableSearchArticle">
        <thead>
            <tr>
                <th><a href="#">Article</a></th>
                <th><a href="#">art.nr.</a></th>
                <th><a href="#">Brand</a></th>
                <th><a href="#">GTIN</a></th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    <a href="http://www.dabas.com/ProductSheet/Detail.ashx/121308" target="_blank">
                        Dalapannkaka fryst ca100st 6kg
                    </a>
                </td>
                <td><span class="mobile-only">Tillverkarens art.nr:</span>11068</td>
                <td><span class="mobile-only">Varumärke:</span>test</td>
                <td><span class="mobile-only">GTIN:</span>07330155011068</td>
            </tr>
            <tr>
                <td>
                    <a href="http://www.dabas.com/ProductSheet/Detail.ashx/124494" target="_blank">
                        Dessertpannkaka fryst ca100st 6kg
                    </a>
                </td>
                <td><span class="mobile-only">Tillverkarens art.nr:</span>11405</td>
                <td><span class="mobile-only">Varumärke:</span>test</td>
                <td><span class="mobile-only">GTIN:</span>07330155114059</td>
            </tr>
        </tbody>
    </table>

    </div>

我正在使用這種方法來嘗試獲取我的價值觀。問題是我不知道在SelectNode()中寫入什麼代碼來獲取包含GTIN號碼的innerHtml。

public void TestGetHtml()
    {
        var doc = new HtmlDocument();
        doc.Load("C:/Users/Desktop/test.html");
        foreach (HtmlNode link in doc.DocumentNode.SelectNodes("TODO: Add code to select all GTIN"))
        {

        }
        doc.Save("file.htm");
    }

一般承認的答案

使用Xpath從id表tableSearchArticle的表體中選擇第四個單元格。然後獲取單元格的內部文本(它將沒有HTML標籤,如GTIN:07330155114059 )並刪除GTIN前綴:

var xpath = "//table[@id='tableSearchArticle']/tbody/tr/td[4]";
var gtins = doc.DocumentNode.SelectNodes(xpath)
               .Select(td => td.InnerText.Replace("GTIN:", ""));

輸出:

[
  "07330155011068",
  "07330155114059"
]

熱門答案

SelectNodes接收Xpath表達式。所以,你可以從這開始(未經測試):

foreach (HtmlNode tr in doc.DocumentNode.SelectNodes(
   "//div[@class='table-wrapper']/table[@id='tableSearchArticle']/tbody/tr"))
{
    Console.WriteLine(tr.InnerHtml);
    Console.WriteLine(tr.SelectSingleNode(".//a").GetAttribute("href"));
    Console.WriteLine(tr.SelectSingleNode(".//td[last()]").InnerText);
}


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因