Выбор значений атрибутов с помощью HTML ловкость обновления
Я пытаюсь извлечь конкретное изображение из html-документа, используя html agility pack и этот xpath:
//div[@id='topslot']/a/img/@src
Насколько я могу видеть, он находит src-атрибут, но возвращает img-тег. Почему это так?
Я ожидал бы, что будет установлен InnerHtml/InnerText или что-то еще, но оба являются пустыми строками. OuterHtml устанавливается в полный img-тег.
Есть ли документация для Html Agility Pack?
6 ответов:
Html Agility Packне поддерживает выбор атрибутов .
Вы можете непосредственно захватить атрибут, если вместо него используете
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