Wählen Sie einen Knoten basierend auf den gleichgeordneten Eigenschaften aus - HtmlAgilityPack - C #

c# html-agility-pack html-parsing

Frage

Ich habe ein HTML-Dokument, das wie folgt strukturiert ist

<ul class="beverageFacts">
<li>
    <span>Vintage</span> 
    <strong>2007&nbsp;</strong>
</li>
<li>
    <span>ABV</span> 
    <strong>13,0&nbsp;%</strong>
</li>
<li>
    <span>Sugar</span> 
    <strong>5&nbsp;gram/liter</strong>
</li>

Ich muss die Werte der <strong> -Tags zu entsprechenden string analysieren, abhängig davon, welchen Wert das <span> -Tag hat.

Ich habe folgendes:

<ul class="beverageFacts">
<li>
    <span>Vintage</span> 
    <strong>2007&nbsp;</strong>
</li>
<li>
    <span>ABV</span> 
    <strong>13,0&nbsp;%</strong>
</li>
<li>
    <span>Sugar</span> 
    <strong>5&nbsp;gram/liter</strong>
</li>

Ab jetzt bin ich Schleife durch jeden Kindknoten der beverageFacts -node die Werte überprüft es auf die richtige entsprechend zu analysieren string . Der Code, den ich bisher bekommen habe, um den "Vintage" -Wert zu erhalten, ist der folgende, obwohl das Ergebnis immer null .

<ul class="beverageFacts">
<li>
    <span>Vintage</span> 
    <strong>2007&nbsp;</strong>
</li>
<li>
    <span>ABV</span> 
    <strong>13,0&nbsp;%</strong>
</li>
<li>
    <span>Sugar</span> 
    <strong>5&nbsp;gram/liter</strong>
</li>

Ich glaube, dass meine Auswahl der Knoten falsch ist, aber ich kann nicht herausfinden, wie man es auf die effizienteste Art und Weise macht.

Gibt es einen einfachen Weg, dies zu erreichen?


Bearbeiten 2013-07-29

Ich habe versucht, die whitespaces wie von enricoariel in den Kommentaren mit dem folgenden Code vorgeschlagen zu entfernen

<ul class="beverageFacts">
<li>
    <span>Vintage</span> 
    <strong>2007&nbsp;</strong>
</li>
<li>
    <span>ABV</span> 
    <strong>13,0&nbsp;%</strong>
</li>
<li>
    <span>Sugar</span> 
    <strong>5&nbsp;gram/liter</strong>
</li>

Das Ergebnis ist immer noch

<ul class="beverageFacts">
<li>
    <span>Vintage</span> 
    <strong>2007&nbsp;</strong>
</li>
<li>
    <span>ABV</span> 
    <strong>13,0&nbsp;%</strong>
</li>
<li>
    <span>Sugar</span> 
    <strong>5&nbsp;gram/liter</strong>
</li>

Akzeptierte Antwort

Beim Betrachten des HTML-Markups wurde mir klar, dass ich nicht tief genug in die Knoten gegangen bin. Auch, wie Enricoariel darauf hinwies, gibt es Whitespaces, die ich nicht richtig reinige. Indem ich das Geschwister überspringe, das die Whitespaces ist, und stattdessen zu dem folgenden springen, bekomme ich das korrekte Ergebnis.

        foreach (HtmlNode bevFactNode in bevFactsNodes)
        {
            HtmlNodeCollection childNodes = bevFactNode.ChildNodes;
            foreach (HtmlNode node in childNodes)
            {
                foreach(HtmlNode subNode in node.ChildNodes)
                {
                    if (subNode.InnerText.Trim() == "Årgång")
                        vintage = HttpUtility.HtmlDecode(subNode.NextSibling.NextSibling.InnerText.Trim());
                }
            }
        }
        Console.WriteLine("Vintage: " + vintage);

wird ausgegeben

        foreach (HtmlNode bevFactNode in bevFactsNodes)
        {
            HtmlNodeCollection childNodes = bevFactNode.ChildNodes;
            foreach (HtmlNode node in childNodes)
            {
                foreach(HtmlNode subNode in node.ChildNodes)
                {
                    if (subNode.InnerText.Trim() == "Årgång")
                        vintage = HttpUtility.HtmlDecode(subNode.NextSibling.NextSibling.InnerText.Trim());
                }
            }
        }
        Console.WriteLine("Vintage: " + vintage);

Ich habe den HTML-Code entschlüsselt, um das Ergebnis korrekt zu formatieren.

Gewonnene Erkenntnisse!


Beliebte Antwort

Zusammenfassend denke ich, dass die beste Lösung darin besteht, alle weißen Bereiche mit einer Regex zu entfernen, bevor der nextSibling-Wert abgerufen wird:

    string myHtml =
    @"
    <ul class='beverageFacts'>
    <li>
        <span>Vintage</span> 
        <strong>2007&nbsp;</strong>
    </li>
    <li>
        <span>ABV</span> 
        <strong>13,0&nbsp;%</strong>
    </li>
    <li>
        <span>Sugar</span> 
        <strong>5&nbsp;gram/liter</strong>
    </li>";
    //Remove space after and before tag
myHtml = Regex.Replace(myHtml, @"\s+<", "<", RegexOptions.Multiline | RegexOptions.Compiled);
myHtml = Regex.Replace(myHtml, @">\s+", "> ", RegexOptions.Compiled | RegexOptions.Multiline);

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(myHtml.Replace("/r", "").Replace("/n", "").Replace("/r/n", "").Replace("  ", ""));
doc.OptionFixNestedTags = true;

HtmlNodeCollection vals = doc.DocumentNode.SelectNodes("//ul[@class='beverageFacts']//span");

var myNodeContent = string.Empty;
foreach (HtmlNode val in vals)
{
    if (val.InnerText == "Vintage")
    {
        myNodeContent = val.NextSibling.InnerText;
    }
}

return myNodeContent;



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