Versuchen, mit HtmlAgilityPack Daten von einer Webseite zu extrahieren

c# html-agility-pack web

Frage

Ich versuche, eine einzelne Daten aus zu extrahieren
http://www.dsebd.org/displayCompany.php?name=NBL
Ich zeigte das erforderliche Feld im angehängten Bild, für das Xpath: / html / body / table [2] / tbody / tr / td [2] / Tabelle / tbody / tr [3] / td 1 / p 1 / Tabelle 1 / tbody / tr / td 1 / tabelle / tbody / tr [2] / td [2] / schrift

Fehler: Ausnahme tritt auf und Daten werden nicht mit diesem X-Pfad gefunden. "Eine nicht behandelte Ausnahme vom Typ 'System.Net.WebException' ist in HtmlAgilityPack.dll aufgetreten"

Bildbeschreibung hier eingeben

Quellcode:

static void Main(string[] args)
    {
        /************************************************************************/
        string tickerid = "Bse_Prc_tick";
        HtmlAgilityPack.HtmlDocument doc = new   HtmlWeb().Load(@"http://www.dsebd.org/displayCompany.php?name=NBL", "GET");

        if (doc != null)
        {
            // Fetch the stock price from the Web page
            string stockprice = doc.DocumentNode.SelectSingleNode(string.Format("./html/body/table[2]/tbody/tr/td[2]/table/tbody/tr[3]/td1/p1/table1/tbody/tr/td1/table/tbody/tr[2]/td[2]/font", tickerid)).InnerText;
            Console.WriteLine(stockprice);
        }
        Console.WriteLine("ReadKey Starts........");
        Console.ReadKey();
}

Akzeptierte Antwort

Nun, ich habe nachgesehen. XPaths, die wir benutzten, sind einfach falsch. Der wahre Spaß beginnt, wenn Sie versuchen werden, den Fehler zu finden.

Schauen Sie sich den Quellcode der Seite an, die Sie benutzen, abgesehen von zahlreichen Fehlern, die XPath's sogar behindern, enthält es sogar mehrere HTML-Tags ...

Chrome Dev Tools und das Tool, das Sie verwendet haben, arbeiten mit dem dom-Baum, der vom Browser korrigiert wurde (alles in einen einzelnen HTML-Knoten gepackt, einige tbody usw. hinzugefügt).

Da die HTML-Struktur einfach unterbrochen ist, wurde HtmlAgilityPack Parsing.

In dieser Situation können Sie entweder RegExp verwenden oder nur bekannte Elemente in der Quelle suchen (was viel schneller, aber weniger agil ist).

Beispielsweise:

...
using System.Net; //required for Webclient
...
        class Program
        {
            //entry point of console app
            static void Main(string[] args)
            {
                // url to download
                // "var" means I am too lazy to write "string" and let compiler decide typing
                var url = @"http://www.dsebd.org/displayCompany.php?name=NBL";

                // creating object in using makes Garbage Collector delete it when using block ends, as opposed to standard cleaning after whole function ends
                using (WebClient client = new WebClient()) // WebClient class inherits IDisposable
                {

                    // simply download result to string, in this case it will be html code
                    string htmlCode = client.DownloadString(url);
                    // cut html in half op position of "Last Trade:"
                    // searching from beginning of string is easier/faster than searching in middle
                    htmlCode = htmlCode.Substring(
                        htmlCode.IndexOf("Last Trade:")
                        );
                    // select from .. to .. and then remove leading and trailing whitespace characters
                    htmlCode = htmlCode.Substring("2\">", "</font></td>").Trim();
                    Console.WriteLine(htmlCode);
                }
                Console.ReadLine();
            }
        }
        // http://stackoverflow.com/a/17253735/3147740 <- copied from here
        // this is Extension Class which adds overloaded Substring() I used in this code, it does what its comments says
        public static class StringExtensions
        {
            /// <summary>
            /// takes a substring between two anchor strings (or the end of the string if that anchor is null)
            /// </summary>
            /// <param name="this">a string</param>
            /// <param name="from">an optional string to search after</param>
            /// <param name="until">an optional string to search before</param>
            /// <param name="comparison">an optional comparison for the search</param>
            /// <returns>a substring based on the search</returns>
            public static string Substring(this string @this, string from = null, string until = null, StringComparison comparison = StringComparison.InvariantCulture)
            {
                var fromLength = (from ?? string.Empty).Length;
                var startIndex = !string.IsNullOrEmpty(from)
                    ? @this.IndexOf(from, comparison) + fromLength
                    : 0;

                if (startIndex < fromLength) { throw new ArgumentException("from: Failed to find an instance of the first anchor"); }

                var endIndex = !string.IsNullOrEmpty(until)
                ? @this.IndexOf(until, startIndex, comparison)
                : @this.Length;

                if (endIndex < 0) { throw new ArgumentException("until: Failed to find an instance of the last anchor"); }

                var subString = @this.Substring(startIndex, endIndex - startIndex);
                return subString;
            }
        }

Beliebte Antwort

Wickeln Sie Ihren Code in try-catch, um weitere Informationen zur Ausnahme zu erhalten.




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