我正在嘗試通過HtmlAgilityPack解析以下html代碼段:
<td bgcolor="silver" width="50%" valign="top">
<table bgcolor="silver" style="font-size: 90%" border="0" cellpadding="2" cellspacing="0"
width="100%">
<tr bgcolor="#003366">
<td>
<font color="white">Info
</td>
<td>
<font color="white">
<center>Price
</td>
<td align="right">
<font color="white">Hourly
</td>
</tr>
<tr>
<td>
<a href='test1.cgi?type=1'>Bookbags</a>
</td>
<td>
$156.42
</td>
<td align="right">
<font color="green">0.11%</font>
</td>
</tr>
<tr>
<td>
<a href='test2.cgi?type=2'>Jeans</a>
</td>
<td>
$235.92
</td>
<td align="right">
<font color="red">100%</font>
</td>
</tr>
</table>
</td>
我的代碼看起來像這樣:
private void ParseHtml(HtmlDocument htmlDoc)
{
var ItemsAndPrices = new Dictionary<string, int>();
var findItemPrices = from links in htmlDoc.DocumentNode.Descendants()
where links.Name.Equals("table") &&
links.Attributes["width"].Equals ("100%") &&
links.Attributes["bgcolor"].Equals("silver")
select new
{
//select item and price
}
在這種情況下,我想elect the item which are Jeans and Bookbags
以及下面的相關prices
並將它們存儲在字典中。
E.g Jeans at price $235.92
有誰知道如何通過htmlagility包和LINQ正確地做到這一點?
假設可能有其他行而你並不特別想要Bookbags和Jeans,我會這樣做:
var table = htmlDoc.DocumentNode
.SelectSingleNode("//table[@bgcolor='silver' and @width='100%']");
var query =
from row in table.Elements("tr").Skip(1) // skip the header row
let columns = row.Elements("td").Take(2) // take only the first two columns
.Select(col => col.InnerText.Trim())
.ToList()
select new
{
Info = columns[0],
Price = Decimal.Parse(columns[1], NumberStyles.Currency),
};