如何在没有 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);
希望对您有所帮助?
我对 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);
希望对您有所帮助?