HtmlAgilityPack extrahiert Text aus allen divs auf einer Seite und nicht nur aus dem im Code angegebenen div

c# html-agility-pack

Frage

Ich habe ein seltsames Verhalten mit einem Xpath-Ausdruck mit HtmlAgilityPack. Ich versuche, das HtmlAgilityPack zu verwenden, um alle Werte in einem div zu deklarieren, das als <div class='cont'> deklariert wird. Wenn ich jedoch den folgenden Code verwende, bekomme ich einfach alle Werte innerhalb von <div class='cont'> AND <div class='button'> . Weiß jemand, warum das passiert? Hier ist der vollständige Code, um es zu reproduzieren:

using System;
using System.Xml.XPath;
using HtmlAgilityPack;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            const string text1 = @"<div class=""cont"">
<h3>content</h3> 
<div style=""margin: 0cm 0cm 0pt"" class=""Normal"">content1</div><div style=""margin: 0cm 0cm 0pt"" class=""Normal""> content2</div>
<div style=""margin: 0cm 0cm 0pt"" class=""Normal"">content3 </div>
<div>content4 </div><strong>content5
<div>content6 </div><ul type=""disc"">    
<div>content7 </div>        
<div>content8 </div>    </ul>
<p class='margin10'><font size=""2"">
<div>
<p><span style=""font-family: Arial"">content9</span></p>
</div>
<div>content10</font><a href=""mailto:james@polis.com""><u><font color=""#0000ff"" size=""2""><font color=""#0000ff"" size=""2""> content11 </u></font></font></a><font size=""2""> content12
<div>content13</div>
</div>
</font>
</p>
</div>
<div class=""button"">
<span class=""applybtn""><a class=""buttonGlobal buttonAlpha"" href=""/uk/job/apply/(id)/608735"">content14</a></span>
</div>";
            foreach (XPathNavigator node in SearchInPage(text1, "//div[@class='cont']"))
            {
                Console.WriteLine("option " + node.Value);
            }

        }

        private static XPathNodeIterator SearchInPage(string text, string xpath)
        {
            HtmlDocument htmlDocument = new HtmlDocument();
            htmlDocument.LoadHtml(text);
            XPathNavigator xpathNavigator = htmlDocument.CreateNavigator();
            XPathNodeIterator nodes = xpathNavigator.Select(xpath);
            return nodes;
        }
    }
}

Der Code gibt zurück: 'content', 'content1-13' PLUS 'content14', der innerhalb von <div class='button'>

Beliebte Antwort

Also, wenn ich richtig verstehe, wollen Sie den Wert nur für die Kinderknoten des Knotens <div class="cont"> ?

Versuche dies:

HtmlDocument doc = new HtmlDocument;
doc.Load(Html);
HtmlNode node = doc.DocumentNode.SelectSingleNode(".//div[@class='cont']");

foreach(HtmlNode childNode in node)
{
    Console.WriteLine(childNode.Value);
}

Ich habe keine Möglichkeit, dies vor mir zu debuggen, aber das sollte funktionieren. the (".//div[@class='cont']") sollte nur den angegebenen Knoten und seine (".//div[@class='cont']") auswählen und alles ignorieren, was sich außerhalb des angegebenen Knotens befindet. Der Rest ist nur Linq und HtmlAgilityPack - Denken Sie daran, HtmlAgilityPack implementiert XPath, also stellen Sie sicher, AgilityPacks verfügbaren Methoden vor der Verwendung von XPath zu sehen ... Denken Sie daran, dass XML und HTML verschiedene Sprachen sind, und was für eine funktioniert nicht unbedingt für die andere.



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