Ich versuche, HtmlAgilityPack zu verwenden, um HTML zu analysieren, aber habe Probleme.
Beispiel HTML-Dokument:
<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>
Ich brauche den Wert von <select name="akt-miest" id="onoffaci">
Beispielsweise:
<option value="**a_0**">**Všetci**</option>
Ich brauche Wert **a_0**
und Text **Všetci**
.
Also versuche ich zuerst den Zugang zur Auswahl per Id:
var selectNode = htmlDoc.GetElementbyId("onoffaci");
Dann mit Xpath wählen Sie alle Option Knoten.
var nodes = selectNode.SelectNodes("//option");
Und Werte erhalten:
foreach (var node in nodes)
{
string roomName = node.NextSibling.InnerText;
string roomId = node.Attributes["value"].Value;
rooms.Add(new Room { RoomId = roomId, RoomName = roomName });
}
Aber ich bekomme Werte von einer anderen Auswahl ( <select id="region" name="region">
) diese Auswahl ist auf der Spitze des HTML-Codes.
BEARBEITET:
Ich trage den Rat von Darin Dimitrov ein und versuche das:
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;
Ich parse nur die ersten drei Optionselemente, weil ich denke, das Problem ist, dass Select bestehen
optgroup-Tag
<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>
.
.
.
Ich versuche, alle folgenden Knoten mit diesem zu wählen
var nodes = selectNode.SelectNodes("option::*");
Aber ich bekomme diesen Fehler: xpath has an invalid token.
Ich möchte auf alle childs von selectNode zugreifen:
HtmlNode selectNode = htmlDoc.GetElementbyId("onoffaci");
EDIT # 2:
Hier ist es alles HTML-Datei, von der ich parse Option Tags benötigen.
Standardmäßig wird das <OPTION>
-Tag von Html Agility Pack als "leer" behandelt, was bedeutet, dass es kein abschließendes </OPTION>
. In diesem Fall wird das schließende Tag verworfen. Sie können dieses Verhalten mithilfe der HtmlNode.ElementFlags
Auflistung HtmlNode.ElementFlags
.
Hier ist ein Code, der tun sollte, was Sie wollen:
HtmlDocument doc = new HtmlDocument();
HtmlNode.ElementsFlags.Remove("option");
doc.LoadHtml(yourHtml);
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//select[@id='onoffaci']//option"))
{
Console.WriteLine("Value=" + node.Attributes["value"].Value);
Console.WriteLine("InnerText=" + node.InnerText);
Console.WriteLine();
}
Ihr XPath-Ausdruck:
//option
Es ist ein absoluter Pfad: Er durchquert den gesamten Baum ausgehend von der Wurzel .
Sie benötigen einen relativen XPath-Ausdruck:
descendant::option
Oder die Kurzschrift
.//option
Beachten Sie: Dies ist der einzige Fall, in dem ein Pfad mit gestartet werden soll .
( self::node()
Kurzschrift) ist nützlich.