HTML Agility Pack Выберите узлы

c# html-agility-pack html-parsing

Вопрос

Я пытаюсь использовать пакет гибкости HTML для очистки некоторых данных с сайта. Я действительно пытаюсь понять, как использовать selectnodes внутри foreach, а затем экспортировать данные в список или массив.

Вот код, с которым я работаю до сих пор.

       string result = string.Empty;

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(http://www.amazon.com/gp/offer-listing/B002UYSHMM/);
        request.Method = "GET";

        using (var stream = request.GetResponse().GetResponseStream())
        using (var reader = new StreamReader(stream, Encoding.UTF8))
        {
            result = reader.ReadToEnd();
        }

        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.Load(new StringReader(result));
        HtmlNode root = doc.DocumentNode;

        string itemdesc = doc.DocumentNode.SelectSingleNode("//h1[@class='producttitle']").InnerText;  //this works perfectly to get the title of the item
        //HtmlNodeCollection sellers = doc.DocumentNode.SelectNodes("//id['bucketnew']/div/table/tbody/tr/td/ul/a/img/@alt");//this does not work at all in getting the alt attribute from the seller images
        HtmlNodeCollection prices = doc.DocumentNode.SelectNodes("//span[@class='price']"); //this works fine getting the prices
        HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//div[@class='resultsset']/table/tbody[@class='result']/tr"); //this is the code I am working on to try to collect each tr in the result.  I then want to eather add each span.price to a list from this and also add each alt attribute from the seller image to a list.  Once I get this working I will want to use an if statement in the case that there is text for the seller name instead of an image.

        List<string> sellers = new List<string>();
        List<string> prices = new List<string>();

        foreach (HtmlNode node in nodes)
        {
            HtmlNode seller = node.SelectSingleNode(".//img/@alt");  // I am not sure if this works
            sellers.Add(seller.SelectSingleNode("img").Attributes["alt"]); //this definitly does not work and will not compile.

        }

У меня есть комментарии в приведенном выше коде, показывающие, что работает, а что нет, и то, что я хочу выполнить.

Если у кого есть какие-либо предложения или чтение, это было бы здорово! Я искал форумы и примеры и не пришел к чему-либо, что я могу использовать.

Принятый ответ

Ваша первая проблема с комментариями SelectNodes не работает, потому что «id» не является именем элемента, это имя атрибута. Вы использовали правильный синтаксис в своих других выражениях для выбора атрибута и сравнения значения. Например, //ElementName[@attributeName='value'] . Я думаю, что даже [attributeName='value'] должен работать, но я не тестировал это.

Синтаксис внутри функции SelectNodes называется «XPath». Эта ссылка может помочь вам.

seller узел seller является дочерним node для текущей итерации, являющейся img с атрибутом alt. Однако я думаю, что правильный синтаксис, который вы хотите, это просто img[@alt] .

Следующая проблема, когда вы говорите, что она не будет компилироваться, проверяет сообщение об ошибке, вероятно, будет жаловаться на аргументы типа аргументов. sellers.Add Я думаю, что называет другой HtmlNode, а не атрибут, который возвращает выражение внутри добавления.

Кроме того, ознакомьтесь с документами Html Agility pack и другими вопросами, касающимися синтаксиса.



Related

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