【发布时间】:2011-06-13 02:51:32
【问题描述】:
我正在尝试使用 HtmlAgilityPack 解析 HTML,但遇到了问题。
示例 HTML 文档:
<tr>
<td class="css_lokalita" colspan="4">
<select id="region" name="region">
<option value="0" selected>Všetky regiony</option>
<optgroup>Banskobystrický kraj</optgroup>
<option value="k_1" style="color: #000000; font-weight:bold;">Banskobystrický kraj</option>
<option value="1"> Banská Bystrica</option>
.
.
.
<option value="174"> CZ - Ústecký kraj</option>
<option value="175"> CZ - Zlínský kraj</option>
</select>
</td>
</tr>
<tr>
<td class="css_sfotkou" colspan="4">
<input type="checkbox" name="foto" value="1" id="foto" />
<label for="foto">Iba používatelia s fotkou</label>
</td>
</tr>
<tr>
<td class="css_miestnost" colspan="4">
<select name="akt-miest" id="onoffaci">
<option value="a_0">Všetci</option>
.
.
.
<optgroup label="Záľuby a záujmy">
<option value="m_1419307"> Bez Lásky</option>
.
.
.
<option value="m_1108016"> Drum N Bass</option>
</optgroup>
</select>
</td>
</tr>
我需要解析来自<select name="akt-miest" id="onoffaci">的值
例如:
<option value="**a_0**">**Všetci**</option>
我需要获取值**a_0** 和文本**Všetci**。
所以我先尝试通过 Id 进行选择:
var selectNode = htmlDoc.GetElementbyId("onoffaci");
然后用 Xpath 选择所有选项节点。
var nodes = selectNode.SelectNodes("//option");
并获取值:
foreach (var node in nodes)
{
string roomName = node.NextSibling.InnerText;
string roomId = node.Attributes["value"].Value;
rooms.Add(new Room { RoomId = roomId, RoomName = roomName });
}
但我从另一个选择 (<select id="region" name="region">) 中获取值,此选择位于 html 代码的顶部。
已编辑:
我应用了 Darin Dimitrov 的建议,试试这个:
HtmlNode selectNode = htmlDoc.GetElementbyId("onoffaci");
var nodes = selectNode.SelectNodes("option");
foreach (var node in nodes)
{
string roomName = node.NextSibling.InnerText;
string roomId = node.Attributes["value"].Value;
rooms.Add(new Room { RoomId = roomId, RoomName = roomName });
}
return rooms;
我只解析前三个选项元素,因为我认为问题在于选择组成
optgroup 标签。
<select name="akt-miest" id="onoffaci">
<option value="a_0">Všetci</option>
<option value="a_1">Iba prihlásení</option>
<option value="a_5" selected="selected">Teraz na Pokeci</option>
<optgroup label="Hlavné miestnosti">
<option value="m_13"> Bez záväzkov</option>
<option value="m_9"> Do pohody</option>
<option value="m_39"> Dámsky klub</option>
</optgroup>
.
.
.
我尝试用这个选择所有以下节点
var nodes = selectNode.SelectNodes("option::*");
但我收到此错误:xpath has an invalid token.
我想访问 selectNode 的所有子节点:
HtmlNode selectNode = htmlDoc.GetElementbyId("onoffaci");
编辑#2:
这是所有 html 文件,我需要从中解析选项标签。
【问题讨论】:
-
@user572844:查看我的答案以获得解决方案和解释。
标签: html select xpath html-agility-pack