#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.