如何在没有 class、id 等的情况下解析出 html 元素

How to parse out a html-element without a class, id etc

我对 C# 和 HtmlAgilityPack 有疑问。 我想解析 material 的价格,但我不知道如何访问此项目。这是 "tr" 中的 "td-element"。问题是有 3 个 "td-elements",我无法访问第二个,只能访问第一个。我希望你能理解我的问题并能帮助我。

这是我要访问的 HTML-代码:

<tr role="row" class="odd" id="itemTable" data-name="clay_r" data-server="1">
    <td>Lehm</td>
    <td>1</td>
    <td><input class="itemboxes" data-name="clay_r" data-server="1" type="checkbox"></td>
</tr>

<tr role="row" class="odd" id="itemTable" data-name="coal_r" data-server="1">
    <td>Kohle</td>
    <td>3</td>
    <td><input class="itemboxes" data-name="coal_r" data-server="1" type="checkbox"></td>
</tr>

这是我用 C# 写下的代码,它可以正常工作,但只针对每个第一个 td 元素:

var products = htmlDocument.DocumentNode.Descendants("div")
                .Where(node => node.GetAttributeValue("id", "")
                .Equals("accordion1")).ToList();

var productListItems = products[0].Descendants("tr")
    .Where(node => node.GetAttributeValue("data-name", "")
    .Contains("")).ToList();


foreach (var productListItem in productListItems)
{
    Console.WriteLine(productListItem.GetAttributeValue("data-name", ""));
    Console.WriteLine(productListItem.Descendants("td").FirstOrDefault().InnerText);

    Console.WriteLine();
}

当我启动程序时,在控制台中显示:

clay_r
莱姆

coal_r
科尔

如我所愿,但应该显示商品的价格而不是 "Lehm" 或 "Kohle"。

FirstOrDefault()return先td(表示<td>Lehm</td>

使用这个:

var tds = productListItem.Descendants("td").ToList();

var name = tds[0].InnerText;
var price = tds[1].InnerText;

Console.WriteLine(name);

注意IndexOutOfRange异常

Antoine V 的替代解决方案非常干净: 我会用属性 "price" 命名 tds 并在你的位置添加一个子句指向 "price".

并通过这种方式访问​​它:

替换这个

Console.WriteLine(productListItem.GetAttributeValue("data-name", ""));

由此

Console.WriteLine(productListItem.Attributes['price'].value));

否则,给每个td加一个class(例如"name" "price"和"chkbox")

Console.WriteLine(productListItem.Descendants("td").Attributes["price"].value);

希望对您有所帮助?