Невозможно разобрать таблицу html в C # с помощью HtmlAgilityPack

c# html-agility-pack

Вопрос

Я хочу прочитать таблицу, показанную в этой ссылке .

Когда я пытался сделать с HtmlAgilityPack , я получаю null

var nodes = document.DocumentNode.SelectNodes("//table[contains(@class, 'table')]");

Не могли бы вы сообщить мне, в чем проблема? Я делаю это неправильно?

Популярные ответы

Нет ничего плохого в вашем xpath. Я просто предполагаю, что вы не знаете, как получить данные из таблицы. Вам нужно искать xpaths.

    public static void Main(string[] args)
    {
        HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.manualslib.com/brand/A.html");
            request.Method = "GET";
            request.ContentType = "text/html;charset=utf-8";

            using (var response = (HttpWebResponse)request.GetResponse())
            {
                using (var stream = response.GetResponseStream())
                {
                    doc.Load(stream, Encoding.GetEncoding("utf-8"));
                }
            }
        }
        catch (WebException ex)
        {
            Console.WriteLine(ex.Message);
        }
        //Works fine
        HtmlNode tablebody = doc.DocumentNode.SelectSingleNode("//table[contains(@class, 'table')]/tbody");
        foreach(HtmlNode tr in tablebody.SelectNodes("./tr"))
        {
            Console.WriteLine("\nTableRow: ");
            foreach(HtmlNode td in tr.SelectNodes("./td"))
            {
                if (td.GetAttributeValue("class", "null") == "col1")
                {
                    Console.Write("\t " + td.InnerText);
                }
                else
                {
                    HtmlNode temp = td.SelectSingleNode(".//div[@class='catel']/a");
                    if (temp != null)
                    {
                        Console.Write("\t " + temp.GetAttributeValue("href", "no url"));
                    }
                }


            }
        }
        Console.ReadKey();
    }

Сначала мы идем в узел, tbody с xpath, но только если атрибут в классе в таблице содержит «таблицу»:

//table[contains(@class, 'table')]/tbody

Теперь мы выбираем все узлы, называемые tr (строка таблицы):

./tr

Точка здесь означает, что из текущего контекста, в котором мы находимся, мы собираемся найти все tr-узлы. Затем в каждом tr-узле мы найдем все td-узлы с:

./td

Теперь в каждой ячейке таблицы мы хотим получить данные. В первом td мы знаем, что атрибут class равен «col1». Поэтому, если td содержит класс с этим значением, мы хотим получить текст внутри этого td-узла.

Если, однако, он не содержит этого атрибута, мы знаем, что мы хотим, чтобы привязывающий тег находился внутри div, у которого есть атрибут class со значением «catel».

Внутри этого якоря-тега мы хотим получить значение атрибута href.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow