Выбор значений атрибутов с помощью пакета HTML Agility Pack
Я пытаюсь получить определенное изображение из html-документа, используя html agility pack и этот xpath:
//div[@id='topslot']/a/img/@src
насколько я вижу, он находит src-атрибут, но возвращает img-тег. Почему так?
Я ожидал бы, что InnerHtml / InnerText или что-то будет установлено, но оба являются пустыми строками. OuterHtml имеет значение полного img-тега.
есть ли документация для HTML Agility Pack?
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'.
в приведенном ниже примере doc.LoadHtml(это.Все это.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;
}
}
я использовал следующий способ получения атрибутов изображения.
var MainImageString = MainImageNode.Attributes.Where(i=> i.Name=="src").FirstOrDefault();
вы можете указать имя атрибута, чтобы получить его значение; если вы не знаете имя атрибута, дайте точку останова после того, как вы извлекли узел и увидите его атрибуты, наведя на него курсор.
надеюсь, что помогла.