HTML-Reading-Option-Tag-Inhalt mit HtmlAgillityPack analysieren

html html-agility-pack select xpath

Frage

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">&nbsp;&nbsp;&nbsp;Banská Bystrica</option>
          .
          .
          .
      <option value="174">&nbsp;&nbsp;&nbsp;CZ - Ústecký kraj</option>
      <option value="175">&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;Bez Lásky</option>
          .
          .
          .
        <option value="m_1108016">&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;Bez záväzkov</option>
    <option value="m_9">&nbsp;&nbsp;&nbsp;Do pohody</option>
    <option value="m_39">&nbsp;&nbsp;&nbsp;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.

http://hotfile.com/dl/98442053/577b556/source.html

Akzeptierte Antwort

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();
}

Beliebte Antwort

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.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum