Parsen eines Elements in einem div mit HTML-Agilitätspaket [C #]

c# html html-agility-pack parsing

Frage

Ich verwende Html Agility Pack auf einer Website, um einige Daten zu extrahieren. Es ist einfach, ein wenig HTML zu analysieren, aber ich habe Probleme mit diesem (etwas komplexen?) Stück HTML.

<tr>
  <td>
    <div onmouseover="toggle('clue_J_1_1', 'clue_J_1_1_stuck', '<em class=&quot;correct_response&quot;>Obama</em><br /><br /><table width=&quot;100%&quot;><tr><td class=&quot;right&quot;>Kailyn</td></tr></table>')" onmouseout="toggle('clue_J_1_1', 'clue_J_1_1_stuck', 'Michelle LaVaughn Robinson')" onclick="togglestick('clue_J_1_1_stuck')">
... 

Ich muss den Wert von der Em-Klasse "correct_response" im onmouseover-div basierend auf dem clue_J_X_Y-Wert erhalten. Ich weiß wirklich nicht, wie ich darüber hinaus gehen soll.

HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//tr//td/div[@onmouseover]");

Etwas Hilfe wäre willkommen.

Beliebte Antwort

Ich weiß nicht, was du von den Em rausholen sollst. Aber ich werde Ihnen alle Daten geben, die Sie brauchen, um es herauszufinden.

Zuerst laden wir den HTML-Code.

    string html = "<tr>" +
        "<td>" +
        "<div onmouseover = \"toggle('clue_J_1_1', 'clue_J_1_1_stuck', '<em class=&quot;correct_response&quot;>Obama</em><br/><br/><table width=&quot;100%&quot;><tr><td class=&quot;right&quot;>Kailyn</td></tr></table>')\" onmouseout = \"toggle('clue_J_1_1', 'clue_J_1_1_stuck', 'Michelle LaVaughn Robinson')\" onclick = \"togglestick('clue_J_1_1_stuck')\"></div></td></tr>";
    HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(html);
    //Console.WriteLine(doc.DocumentNode.OuterHtml);

Dann erhalten wir den Wert des Attributs onmouseover.

        string toggle = doc.DocumentNode.SelectSingleNode("//tr//td/div[@onmouseover]").GetAttributeValue("onmouseover", "FAILED");

Es wird FAILED zurückgegeben, wenn es kein Attribut namens "onmouseover" gefunden hat. Jetzt erhalten wir die Parameter der Toggle-Methode, bei denen jeweils zwei durch '(Apostroph) eingeschlossen sind.

//Get Variables from toggle()
List<string> toggleVariables = new List<string>();
bool flag = false; string temp = "";
for(int i=0; i<toggle.Length; i++)
{
    if (toggle[i] == '\'' && flag== true)
    {
        toggleVariables.Add(temp);
        temp = "";
        flag = false;
    }
    else if (flag)
    {
        temp += toggle[i];
    }
    else if (toggle[i] == '\'')
    {
        flag = true;
    }
}

Danach haben wir eine Liste mit 3 Entitäten. In diesem Fall wird es Folgendes enthalten.

  • clue_J_1_1
  • clue_J_1_1_stuck
  • <em class = "correct_response"> Obama </ em> <br/> <br/> <tabelle width = "100%"> <tr> <td class = "right"> Kailyn </ td> </ tr> </ table>;

Jetzt können wir ein neues HtmlDocument mit dem HTML-Code aus dem dritten Parameter erstellen. Aber zuerst müssen wir es in ausführbaren HTML konvertieren, da der dritte Parameter Escape-Zeichen aus HTML enthält.

        //Make it into workable HTML
        toggleVariables[2] = HttpUtility.HtmlDecode(toggleVariables[2]);

        //New HtmlDocument
        HtmlDocument htmlInsideToggle = new HtmlDocument();
        htmlInsideToggle.LoadHtml(toggleVariables[2]);

        Console.WriteLine(htmlInsideToggle.DocumentNode.OuterHtml);

Und fertig. Der Code in seiner Gesamtheit ist unten von hier.

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using HtmlAgilityPack;
using System.Web;

namespace test
{
    class Program
    {

    public static void Main(string[] args)
    { 
            string html = "<tr>" +
                "<td>" +
                "<div onmouseover = \"toggle('clue_J_1_1', 'clue_J_1_1_stuck', '<em class=&quot;correct_response&quot;>Obama</em><br/><br/><table width=&quot;100%&quot;><tr><td class=&quot;right&quot;>Kailyn</td></tr></table>')\" onmouseout = \"toggle('clue_J_1_1', 'clue_J_1_1_stuck', 'Michelle LaVaughn Robinson')\" onclick = \"togglestick('clue_J_1_1_stuck')\"></div></td></tr>";
            HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(html);
            //Console.WriteLine(doc.DocumentNode.OuterHtml);

            string toggle = doc.DocumentNode.SelectSingleNode("//tr//td/div[@onmouseover]").GetAttributeValue("onmouseover", "FAILED");
            //Clean up string

            //Console.WriteLine(toggle);

            //Get Variables from toggle()
            List<string> toggleVariables = new List<string>();
            bool flag = false; string temp = "";
            for(int i=0; i<toggle.Length; i++)
            {
                if (toggle[i] == '\'' && flag== true)
                {
                    toggleVariables.Add(temp);
                    temp = "";
                    flag = false;
                }
                else if (flag)
                {
                    temp += toggle[i];
                }
                else if (toggle[i] == '\'')
                {
                    flag = true;
                }
            }

            //Make it into workable HTML
            toggleVariables[2] = HttpUtility.HtmlDecode(toggleVariables[2]);
            //New HtmlDocument
            HtmlDocument htmlInsideToggle = new HtmlDocument();
            htmlInsideToggle.LoadHtml(toggleVariables[2]);

            Console.WriteLine(htmlInsideToggle.DocumentNode.OuterHtml);

            //You're on your own from here                

            Console.ReadKey();

    }
}


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