使用敏捷包读取、分组和排序html文档中的节点
本文关键字:排序 html 文档 节点 包读取 读取 | 更新日期: 2023-09-27 18:05:54
我正在尝试建立一个类,将读取,分组和排序基于另一个网站的html文档。
我将展示我到目前为止所拥有的东西。下面是一个如何构建网页的示例(请记住,它只是"如何"构建的,我已经重写了整个内容):
<tr>
<td id="ab100_ab100_ab100_Main_Sub_Sub_objComponent" class="compContainer">
<table class="objDetails" style="position: relative; margin: auto;">
<tr>
<div class="smallSetup" style="margin-top: 10px;">
<b class="ft"><b></b></b>
<div id="ab100_ab100_ab100_Main_Sub_Sub_firstProp" class="row">
<div class="label">
First Name:</div>
<div class="value">
Albert Trebla</div>
</div>
<div id="ab100_ab100_ab100_Main_Sub_Sub_secondProp" class="row">
<div class="label" style="line-height:25px;">
Second Year:</div>
<div class="value">
<img src="/Setup/Images.ashx?size=medium&name=5&type=symbol" alt="5" align="absbottom" /><img src="/Setup/Images.ashx?size=medium&name=W&type=symbol" alt="Second" align="absbottom" />
</div>
<div id="ab100_ab100_ab100_Main_Sub_Sub_thirdProp" class="row" style="height:15px; position:relative;">
<div class="label" style="font-size:.7em;">
Classy Stuff:</div>
<div class="value">
7<br /><br /></div>
</div>
<div id="ab100_ab100_ab100_Main_Sub_Sub_fourthProp" class="row">
<div class="label">
Weather:</div>
<div class="value">
Cloudy — Might Rain</div>
</div>
<div id="ab100_ab100_ab100_Main_Sub_Sub_fifthProp" class="row">
<div class="label">
Front Text:</div>
<div class="value">
<div class="frontTextBox">Opened</div><div class="frontTextBox">The shop is opened when the bridges are lowered.</div></div>
</div>
<div id="ab100_ab100_ab100_Main_Sub_Sub_sixthProp" class="row">
<div class="label">
Flavor:</div>
<div id="ctl00_ctl00_ctl00_MainContent_SubContent_SubContent_FlavorText" class="value">
<div class="frontTextBox"><i>"This taste good!"</i></div></div>
</div>
等等
现在我在我的应用程序中如何组织我的代码:
HtmlWeb loader = new HtmlWeb();
HtmlDocument doc = loader.Load(stringUrl);
HtmlNode parentNode = doc.GetElementById(ab100_ab100_ab100_Main_Sub_Sub_objComponent);
HtmlNodeCollection allNodes = parentNode.SelectNodes(".//div[@class='row']");
我有我的div集合,但我无法进行下一步。首先要理解的是,上面html代码的布局会改变,所以有时firstProp不会显示,有时是第六个prop,等等。
所以我想检查节点的属性是否为"label":
foreach (HtmlNode htmlNode in allNodes)
{
if (htmlNode.Attributes["class"].Value == "label")
{
}
}
但我不知道如何检查值后,因为下一个兄弟是一个空div。我不知道多少HtmlAgilityPack的工作,所以我想知道是否有一个更容易的方法来得到这个。
谁能告诉我如何继续,或者如果我做错了,如何纠正它?
* EDIT *
我已经改变了行:
HtmlNodeCollection allNodes = parentNode.SelectNodes(".//div[@class='row']");
,现在我的集合只缩小到我将得到的div。但是我仍然需要阅读,当我得到一个div类"label",读取它的值是什么(例如:Front Text),如果这是Front Text,得到下面的div类"value"。
我建议您学习一点XPATH,它由Html Agility Pack支持,允许在Html DOM上进行简洁的查询。例如,下面的代码:
HtmlDocument doc = new HtmlDocument();
doc.Load("test.htm");
HtmlNode node = doc.GetElementbyId("ab100_ab100_ab100_Main_Sub_Sub_objComponent");
foreach (HtmlNode row in node.SelectNodes(".//div[@class='row']"))
{
Console.Write(row.SelectSingleNode("div[@class='label']").InnerText.Trim());
Console.WriteLine(row.SelectSingleNode("div[@class='value']").InnerText.Trim());
}
将输出如下:
First Name:Albert Trebla
Second Year:
Classy Stuff:7
Weather:Cloudy - Might Rain
Front Text:OpenedThe shop is opened when the bridges are lowered.
Flavor:"This taste good!"
如果在值或标签div中需要HTML,那么可以从那里再次发出XPATH查询。