HtmlAgility überprüft, ob eine Unterklasse mit einem bestimmten Namen existiert

c# html-agility-pack

Frage

<li class="sn-g">
     <span class="num">1</span>
     <span class="sym_first">
          <a class="icon>&nbsp;</a>
     </span>
     <span class="def">...text</span>
</li>

Meine HTML-Seite enthält solche Unterklassen. Die Klasse sym_first ist jedoch nicht immer vorhanden. Mit HTMLAgility möchte ich herausfinden, ob sym_first Klasse sym_first auf der Webseite existiert. Wenn es existiert, möchte ich den InnerText von def Klasse erhalten.

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//span[@class='" + sng + "']"))
{
   //How do I write this block?
   if(doc.DocumentNode.SelectNodes("//span[@class='" + symfirst + "']").Contains(xxx)
   {
      //get inner text
   }
} 

Beliebte Antwort

Sie können versuchen, SelectSingleNode() und überprüfen, ob der Rückgabewert nicht null :

if(doc.DocumentNode.SelectSingleNode("//span[@class='sym_first']") != null)
{
    //get inner text
}

oder wenn Sie die Klasse sym_first innerhalb der aktuellen li überprüfen sym_first (vorausgesetzt, dass Sie li im betreffenden Code-Snippet durchlaufen):

if(node.SelectSingleNode("span[@class='sym_first']") != null)
{
    //get inner text
}

UPDATE:

Als Reaktion auf den Fehler, der im Kommentar unten gemeldet wurde, versuchen Sie, zu überprüfen, ob auch eine def Klasse existiert:

var sym_first = node.SelectSingleNode("span[@class='sym_first']");
var def = node.SelectSingleNode("span[@class='def']");
if(sym_first != null && def != null)
{
    //get inner text
}

Abhängig von den Anforderungen möchten Sie möglicherweise nur über li Elemente mit diesem spezifischen Inhalt iterieren:

var query = "//li[@class='sn-g'][span[@class='sym_first'] and span[@class='def']]";
foreach (HtmlNode node in doc.DocumentNode.SelectNodes(query))
{
   //get inner text
} 


Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow