Выбор значений атрибутов с помощью HTML ловкость обновления



Я пытаюсь извлечь конкретное изображение из html-документа, используя html agility pack и этот xpath:



//div[@id='topslot']/a/img/@src


Насколько я могу видеть, он находит src-атрибут, но возвращает img-тег. Почему это так?



Я ожидал бы, что будет установлен InnerHtml/InnerText или что-то еще, но оба являются пустыми строками. OuterHtml устанавливается в полный img-тег.



Есть ли документация для Html Agility Pack?

547   6  

6 ответов:

Вы можете непосредственно захватить атрибут, если вместо него используете HtmlNavigator.

//Load document from some html string
HtmlDocument hdoc = new HtmlDocument();
hdoc.LoadHtml(htmlContent);

//Load navigator for current document
HtmlNodeNavigator navigator = (HtmlNodeNavigator)hdoc.CreateNavigator();

//Get value from given xpath
string xpath = "//div[@id='topslot']/a/img/@src";
string val = navigator.SelectSingleNode(xpath).Value;

Вы можете использовать метод "GetAttributeValue".

Пример:

//[...] code before needs to load a html document
HtmlAgilityPack.HtmlDocument htmldoc = e.Document;
//get all nodes "a" matching the XPath expression
HtmlNodeCollection AllNodes = htmldoc.DocumentNode.SelectNodes("*[@class='item']/p/a");
//show a messagebox for each node found that shows the content of attribute "href"
foreach (var MensaNode in AllNodes)
{
     string url = MensaNode.GetAttributeValue("href", "not found");
     MessageBox.Show(url);
}

Html Agility Pack скоро его поддержит.

Http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=204342

Чтение и запись атрибутов с помощью HTML Agility Pack

Вы можете как читать, так и устанавливать атрибуты в HtmlAgilityPack. В этом примере выбирается тег и атрибут 'Lang' (language), если он существует, а затем выполняется чтение и запись в атрибут 'lang'.

В приведенном ниже примере, док.LoadHtml(это.Все это.Все " - это строковое представление html-документа.

Чтение и запись:

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(this.All);
            string language = string.Empty;
            var nodes = doc.DocumentNode.SelectNodes("//html");
            for (int i = 0; i < nodes.Count; i++)
            {
                if (nodes[i] != null && nodes[i].Attributes.Count > 0 && nodes[i].Attributes.Contains("lang"))
                {
                    language = nodes[i].Attributes["lang"].Value; //Get attribute
                    nodes[i].Attributes["lang"].Value = "en-US"; //Set attribute
                }
            }

Только для чтения:

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(this.All);
            string language = string.Empty;
            var nodes = doc.DocumentNode.SelectNodes("//html");
            foreach (HtmlNode a in nodes)
            {
                if (a != null && a.Attributes.Count > 0 && a.Attributes.Contains("lang"))
                {
                    language = a.Attributes["lang"].Value;
                }
            }

Я использовал следующий способ для получения атрибутов изображения.

var MainImageString  = MainImageNode.Attributes.Where(i=> i.Name=="src").FirstOrDefault();

Вы можете указать имя атрибута, чтобы получить его значение; если вы не знаете имя атрибута, дайте точку останова после того, как вы выбрали узел и видите его атрибуты, наведя на него курсор мыши.

Надеюсь, я помог.

Comments

    Ничего не найдено.