получение тегов и атрибута с помощью htmlagilitypack с vb.net

#vb.net #html-agility-pack

#vb.net #html-пакет гибкости

Вопрос:

у меня есть этот код

 Dim htmldoc As HtmlDocument = New HtmlDocument()
htmldoc.LoadHtml(strPageContent)
Dim root As HtmlNode = htmldoc.DocumentNode

For Each link As HtmlNode In root.SelectNodes("//a")
    If link.HasAttributes("href") Then doSomething() 'this doesn't work because hasAttributes only checks whether an element has attributes or not
Next
  

но я получаю сообщение об ошибке Object reference not set to an instance of an object.

документ содержит хотя бы один тег привязки? как мне проверить, завершается ли атрибут?

я попробовал это if link.HasAttributes("title") then и получил другую ошибку

Public ReadOnly Property HasAttributes() As Boolean' has no parameters and its return type cannot be indexed.

Ответ №1:

Если HtmlAgilityPack поддерживает этот селектор XPATH, вы можете заменить //a на //a[@href]

 For Each link as HtmlNode In root.SelectNodes("//a[@href]")
    doSomething()
Next
  

В противном случае вы можете использовать Attributes свойство:

 For Each link as HtmlNode In root.SelectNodes("//a")
    If link.Attributes.Any(Function(a) a.Name = "href") Then doSomething()
Next
  

Комментарии:

1. @jay я извлекаю не только ссылки, но и атрибут title, и внутренний текст, так как же мне это сделать?

2. @Smith HasAttributes — это не метод, это свойство — вы не можете использовать круглые скобки и аргументы. Существует также Attributes свойство, которое вернет все атрибуты, связанные с данным элементом node. Какая строка кода приводит к NullReferenceException ?

3. @Smith Подробнее о вашем вопросе смотрите в моем втором примере. Внутри For…Each блока вы можете проверить, link.Attributes содержит ли он href атрибут, но вы также можете проверить наличие других атрибутов и / или использовать link.InnerText свойство, чтобы получить внутренний текст тега привязки.

4. @jay спасибо что, если я захочу проверить, есть ли title или alt или другие атрибуты, как мне выполнить эту проверку?

5. @Smith Для .NET 2.0 вам просто нужно выполнить For Each цикл поверх link.Attributes и проверить .Name для каждого.

Ответ №2:

 Dim htmldoc As HtmlDocument = New HtmlDocument()
htmldoc.LoadHtml(strPageContent)
Dim root As HtmlNode = htmldoc.DocumentNode

var nodes = root.SelectNodes("//a[@href and @title]")
if (nodes <> Null) Then
    For Each link As HtmlNode In nodes
        If link.HasAttributes("href") Then doSomething() 'this doesn't work because hasAttributes only checks whether an element has attributes or not
    Next
end if
  

Кроме того, вы можете проверить наличие атрибутов:
Ссылка.Атрибуты [«title»] если null, то атрибут отсутствует.
Та же ссылка.Атрибуты [«href»] и т.д.

Ссылка на свойство.HasAttributes показывает только, что у тега есть какой-либо атрибут, это значение bool.