2009-02-12 2 views
8

Я пытаюсь получить конкретное изображение из документа HTML, используя HTML ловкость пакета и этот XPath:Выбор значений атрибутов с HTML Agility обновлением

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

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

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

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

ответ

11

Html Agility Pack does not support выбор атрибута.

+5

Я просто использовал его, чтобы выбрать все div, где атрибут align установлен в центр. "// div [@ align = 'center']" – clamchoda

+0

Возможно с небольшим обходным решением, см. мой ответ ниже. –

15

Вы можете непосредственно захватить атрибут, если вы используете 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; 
+1

Хотя это работает для чтения значения атрибута, его невозможно изменить. Вызов '.SetValue (« new_value »)' на выбранном узле атрибута вызывает «System.NotSupportedException», так как возвращаемый «HtmlNodeNavigator» является ** доступен только для чтения **. – Andre

+0

Не является ли этот ответ прямым противоречием принятому ответу (модификация не была частью вопроса)? –

+0

@ DavidS.Я думаю, что ОП просто никогда не беспокоился о переключении с тех пор, как я добавил этот ответ примерно через 4 года –

7

Вы можете использовать метод «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

Чтение и запись атрибутов с Html Agility обновления

Вы можете читать и установить атрибуты в HtmlAgilityPack. В этом примере вы выбираете тег < html> и выбираете атрибут 'lang' (language), если он существует, а затем читает и записывает атрибут '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; 
       } 
      } 
0

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

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

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

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

Смежные вопросы