Выбор значений атрибутов с помощью html Agility Pack - PullRequest
9 голосов
/ 12 февраля 2009

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

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

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

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

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

Ответы [ 6 ]

15 голосов
/ 14 марта 2013

Вы можете напрямую получить атрибут, если вместо этого используете 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;
11 голосов
/ 23 февраля 2009

Html Agility Pack не поддерживает выбор атрибутов.

7 голосов
/ 31 марта 2013

Вы можете использовать метод "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);
}
1 голос
/ 25 декабря 2015

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

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

В приведенном ниже примере doc.LoadHtml (this.All), "this.All" является строковым представлением 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;
                }
            }
1 голос
/ 26 июня 2010

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

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

0 голосов
/ 06 сентября 2016

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

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

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

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

...