none
HTMLAgilityPack problem RRS feed

  • Frage

  • Hallo,

    für mein aktuelles App muss ich verschiedene Webseiten auslesen. Da bietet sich das HTMLAgiliytPack an. Jetzt habe ich nach einem Sample gesucht welches per Button Click oder Methode aufgerufen werden kann. Mein Problem liegt jedoch im Code.

    Das Programm selber starten problem los und trifft auch auf keine Fehler jedoch kann ich mir einen Punkt nicht erklären.

    HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
    
                // There are various options, set as needed
                htmlDoc.OptionFixNestedTags = true;
    
                // filePath is a path to a file containing the html
                htmlDoc.LoadHtml("http://www.daserste.de/");
    
                // Use:  htmlDoc.LoadHtml(xmlString);  to load from a string (was htmlDoc.LoadXML(xmlString)
    
                // ParseErrors is an ArrayList containing any errors from the Load statement
                if (htmlDoc.ParseErrors != null && htmlDoc.ParseErrors.Count() > 0)
                {
                    // Handle any parse errors as required
    
                }
                else
                {
    
                    if (htmlDoc.DocumentNode != null)
                    {
                        HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//p[@href='dachzeile']");
    
                        if (bodyNode != null)
                        {
                            MessageBox.Show(bodyNode.SelectSingleNode(".//p").ToString());
                        }
                    }
                }

    Hier könnt ihr den Code sehen. Mein Problem liegt darin das bei der If Abfrage ("if (bodyNode != null)") immer null ausgibt. Also er kommt nie dazu den Code im inneren auszuführen.

    Ich habe es mit verschieden SelectedSingleNodes probiert. Sogar verschieden Internetseiten haben nicht verändert.

    Wieso ist das so und was genau bedeutet es wenn bodyNode = null ist?

    mfg Elias

    EDIT

    Ich habe als Test einfach mal den Code so abgeändert, das er einen Schritt weiter geht, jedoch stürzt dann mein App ab.

    Error:

    In System.NullReferenceException ist eine Ausnahme vom Typ "dontwatchtwice.DLL" aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.

    EDIT II

    Nach weiterer recherche habe ich ein weites Sample von Nokia gestartet.

    Dort ist auch ein Error Handling eingebaut welches mir promt diesen Fehler an den Kopf wirft.

    The remote Server returned an error: NotFound.


    Grad Umrechner: http://www.windowsphone.com/de-de/store/app/grad-umrechner/59165d3f-6219-4bda-84c5-e55a166f5f3d EselsbrückenBETA: http://www.windowsphone.com/de-de/store/app/eselsbr%C3%BCcken-beta/f9245a85-6953-40c2-9311-0e1bba6934cf




    Samstag, 17. Mai 2014 18:17

Antworten

  • Hallo,
    ich habe den Download mal über einen WebClient auf dem WP Simulator probiert. Es gab keine Probleme:
    WebClient wc = new WebClient();
    wc.DownloadStringCompleted += (s2, e2) =>
    {
        MessageBox.Show("Result: " + e2.Result);
        MessageBox.Show("Error: " + e2.Error);
    };
    wc.DownloadStringAsync(new Uri(@"http://programm.daserste.de/pages/programm/liste.aspx"));
    Bist du dir sicher, das das Testgerät/der Simulator auch Internetzugriff hat? Das ist das Einzige, wie ich mir den Fehler erklären kann.

    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Sonntag, 18. Mai 2014 12:24

Alle Antworten

  • Hallo,
    wenn bodyNode null ist, dann wurde der gesuchte Knoten einfach nicht gefunden.
    Die NullReferenceException, die du erhälst, heißt nur, dass bodyNode null ist und darum ToString nicht aufgerufen werden kann.

    In folgender Zeile liegt wahrscheinlich der Fehler:

    HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//p[@href='dachzeile']");

    Du versuchst mit einem XPath einen Knoten im Dokument auszuwählen. Der angegebene XPath wird wie folgt ausgewertet:

    • Finde alle <p> Elemente
      Wird durch das //p bestimmt
    • Filtere die <p>-Elemente heraus, deren href-Attribut den Wert "dachzeile" hat
      Einschränkungen werden in [] geschrieben. Jede Eigenschaft wird mit einem @ vor ihrem Namen angegeben. Dahinter steht der Vergleichswert.

    Mehr zu XPath findest du hier.

    Syntaktisch kann ein p-Tag (Absatz) kein href-Attribut (Linkziel) haben. Somit sollte nie ein Ergebnis gefunden werden.
    Um ein korrektes Ergebnis zu erhalten, musst du den XPath entsprechend an deine Vorgaben anpassen.

    Beachte aber, dass sich der Webseitencode jederzeit ändern kann. Weiterhin sollte abgeklärt sein ob du die Informationen der Webseite nutzen darfst.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Sonntag, 18. Mai 2014 00:54
  • Hallo Tom,

    ich habe den Code nochmal angeändert jedoch ändert sich nichts.

    HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
    
                // There are various options, set as needed
                htmlDoc.OptionFixNestedTags = true;
    
                // filePath is a path to a file containing the html
                htmlDoc.LoadHtml("http://programm.daserste.de/pages/programm/liste.aspx");
    
                // Use:  htmlDoc.LoadHtml(xmlString);  to load from a string (was htmlDoc.LoadXML(xmlString)
    
                // ParseErrors is an ArrayList containing any errors from the Load statement
                if (htmlDoc.ParseErrors != null && htmlDoc.ParseErrors.Count() > 0)
                {
                    // Handle any parse errors as required
    
                }
                else
                {
    
                    if (htmlDoc.DocumentNode != null)
                    {
                        HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//div[@class='Sendetitel']");
    
                        if (bodyNode != null)
                        {
                            MessageBox.Show(bodyNode.SelectSingleNode(".//a").InnerText.ToString());
                        }
                    }
                }

    Mir scheint es als würde das HTML Agility pack nicht mehr unterstützt werde. Den keines meiner Samples die früher funktioniert haben gehen noch.

    LG Elias

    EDIT

    Das Problem scheint mit Windows Phone zusammen zuhängen denn wenn ich den Code per WebClient downloaden möchte bekomme ich den selben Fehler wie oben.

    The remote Server returned an error: NotFound.


    Grad Umrechner: http://www.windowsphone.com/de-de/store/app/grad-umrechner/59165d3f-6219-4bda-84c5-e55a166f5f3d EselsbrückenBETA: http://www.windowsphone.com/de-de/store/app/eselsbr%C3%BCcken-beta/f9245a85-6953-40c2-9311-0e1bba6934cf


    Sonntag, 18. Mai 2014 05:47
  • Hallo,
    ich habe den Download mal über einen WebClient auf dem WP Simulator probiert. Es gab keine Probleme:
    WebClient wc = new WebClient();
    wc.DownloadStringCompleted += (s2, e2) =>
    {
        MessageBox.Show("Result: " + e2.Result);
        MessageBox.Show("Error: " + e2.Error);
    };
    wc.DownloadStringAsync(new Uri(@"http://programm.daserste.de/pages/programm/liste.aspx"));
    Bist du dir sicher, das das Testgerät/der Simulator auch Internetzugriff hat? Das ist das Einzige, wie ich mir den Fehler erklären kann.

    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Sonntag, 18. Mai 2014 12:24
  • Hallo,

    häh ich habe heute Morgen schon eine eigene Lösung gepostet doch sie ist einfach weg. Mein Problem, lag daran das mein Emulator, wie Tom schon vermutet, kein Internet zugriff hat/hatte.

    Das Problem hat sich geklärt, jedoch wundert es mich trotzdem das der Download per HTMLAgility... nicht funktioniert.

    LG Elias


    Grad Umrechner: http://www.windowsphone.com/de-de/store/app/grad-umrechner/59165d3f-6219-4bda-84c5-e55a166f5f3d EselsbrückenBETA: http://www.windowsphone.com/de-de/store/app/eselsbr%C3%BCcken-beta/f9245a85-6953-40c2-9311-0e1bba6934cf

    Sonntag, 18. Mai 2014 19:06