使用VB.Net中的HTMLAgilitypack防止错误

时间:2010-12-26 13:56:27

标签: vb.net parsing error-handling html-parsing html-agility-pack

我正在使用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的任何内容。

先谢谢你们,祝大家社区:)

2 个答案:

答案 0 :(得分:2)

在尝试解析返回的数据之前,您需要检查返回的content-type标头。

对于HTML页面,这应该是text/html,因为XHTML将是application/xhtml+xml

答案 1 :(得分:0)

如果您只有内容(如果您无法访问Oded建议的原始HTTP标头),您可以假设一个好的HTML字符串至少应包含“<”例如,字符串中的10个第一个字符。

当然,没有保证,你仍然需要处理极端情况,但这应该丢弃大多数垃圾或意外的内容类型,并让特定的编码字节通过(如UTF-8字节顺序标记等) ...)。