使用HTML敏捷包关联相邻元素值
本文关键字:元素 关联 HTML 包关联 使用 | 更新日期: 2023-09-27 18:03:30
我试图抓取HTML注释后面的h2元素,文本"Results",然后是类名"stockfeed"的表元素。
我已经弄清楚如何拉我需要的数据(见下面),但我不确定如何在同一时间拉2个元素在一起。我知道我可以使用相同的索引器迭代集合来关联值,但这似乎容易出错,因为我的h2元素之一可能没有相邻的表元素(罕见但可能)。
HTML标记示例:
<h1>
Results Page</h1>
<h2>
Updated Daily @ 10:00 AM</h2>
<div class='someClass1'>
<!-- Results -->
<div class='something'>
</div>
<h2 style='display: inline;'>
<a href='http://www.somesite.com'>Table 1</a>
</h2>
<div class='clr'>
</div>
<div class='resultBlock'>
<table class='stockfeed'>
<thead>
<tr>
<th>
Part
</th>
<th>
Description
</th>
<th>
Stock
</th>
<th>
Price
</th>
</tr>
</thead>
<tbody>
<tr class='row1' valign='top'>
<td>
A 1234567890
</td>
<td class='description'>
Part Description
</td>
<td>
1,000,000
</td>
<td>
$1.99
</td>
</tr>
<tr class='row1' valign='top'>
<td>
B 1234567890
</td>
<td class='description'>
Part Description
</td>
<td>
1,000,000
</td>
<td>
$1.99
</td>
</tr>
<tr class='row1' valign='top'>
<td>
C 1234567890
</td>
<td class='description'>
Part Description
</td>
<td>
1,000,000
</td>
<td>
$1.99
</td>
</tr>
</tbody>
</table>
</div>
<!-- Results -->
<div class='something'>
</div>
<h2 style='display: inline;'>
<a href='http://www.somesite.com'>Table 2</a>
</h2>
<div class='clr'>
</div>
<div class='resultBlock'>
<table class='stockfeed'>
<thead>
<tr>
<th>
Part
</th>
<th>
Description
</th>
<th>
Stock
</th>
<th>
Price
</th>
</tr>
</thead>
<tbody>
<tr class='row1' valign='top'>
<td>
A 1234567890
</td>
<td class='description'>
Part Description
</td>
<td>
1,000,000
</td>
<td>
$1.99
</td>
</tr>
<tr class='row1' valign='top'>
<td>
B 1234567890
</td>
<td class='description'>
Part Description
</td>
<td>
1,000,000
</td>
<td>
$1.99
</td>
</tr>
<tr class='row1' valign='top'>
<td>
C 1234567890
</td>
<td class='description'>
Part Description
</td>
<td>
1,000,000
</td>
<td>
$1.99
</td>
</tr>
</tbody>
</table>
</div>
</div>
分别解析值的当前代码:
HtmlNodeCollection titles = doc.DocumentNode.SelectNodes("//comment()[contains(.,'Results')]/following-sibling::h2");
for (int tit = 0; tit < titles.Count; ++tit)
{
// Do Something
}
HtmlNodeCollection tables = doc.DocumentNode.SelectNodes("//table[@class='stockfeed']");
for (int tab = 0; tab < tables.Count; ++tab)
{
// Do Something
}
因此,如果我正确阅读这篇文章,您正试图获得每个结果的相应表。
您可以使用与获取以下h2
元素类似的方法来获取与其相关的以下table
元素。
var query = doc.DocumentNode
.SelectNodes("//comment()[contains(.,'Results')]/following-sibling::h2");
foreach (var h2 in query.Cast<HtmlNode>())
{
var table = h2.SelectSingleNode("following-sibling::*/table[@class='stockfeed']");
// do stuff with h2 and table
}