我正在使用HTMLAgilityPack来解析HTML页面。但是在某些时候我尝试解析错误的数据(在这种特定情况下是一个图像),其中ofc因为显而易见的原因而失败。
Private Sub parseHtml(ByVal content As String, ByVal url As String)
Try
Dim contentHash As String = hashGenerator.ComputeHash(content, "SHA1")
Dim doc As HtmlDocument = New HtmlDocument()
doc.Load(New StringReader(content))
Dim root As HtmlNode = doc.DocumentNode
Dim anchorTags As New List(Of String)
For Each link As HtmlNode In root.SelectNodes("//a")
cururl = link.OuterHtml
If link.Attributes("href") Is Nothing Then Continue For
If Uri.IsWellFormedUriString(link.Attributes("href").Value, UriKind.Absolute) Then
urlQueue.Enqueue(link.Attributes("href").Value)
Else
Dim myUri As New Uri(url)
urlQueue.Enqueue(myUri.Scheme & "://" & myUri.Host & link.Attributes("href").Value)
End If
Next
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Error (parseHtml(" & url & "))")
End Try
End Sub
我得到的错误是:
类型的第一次机会异常 'System.NullReferenceException' 发生在Webcrawler.exe对象中 引用未设置为的实例 对象
关于我尝试解析的内容:
Iޥ + :8 0 x
如何在尝试解析内容之前检查内容是否“可解析”以防止错误?
现在它是一个弹出错误的图像,但我认为它可能只是不是(x)html的任何内容。
先谢谢你们,祝大家社区:)
答案 0 :(得分:2)
在尝试解析返回的数据之前,您需要检查返回的content-type
标头。
对于HTML页面,这应该是text/html
,因为XHTML将是application/xhtml+xml
。
答案 1 :(得分:0)
如果您只有内容(如果您无法访问Oded建议的原始HTTP标头),您可以假设一个好的HTML字符串至少应包含“<”例如,字符串中的10个第一个字符。
当然,没有保证,你仍然需要处理极端情况,但这应该丢弃大多数垃圾或意外的内容类型,并让特定的编码字节通过(如UTF-8字节顺序标记等) ...)。