Предотвращение ошибок с помощью HTMLAgilitypack в VB.Net - PullRequest
0 голосов
/ 26 декабря 2010

Я использую HTMLAgilityPack для разбора HTML-страниц.Однако в какой-то момент я пытаюсь проанализировать неправильные данные (в данном конкретном случае - изображение), который по понятным причинам не работает.

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 ]

2 голосов
/ 26 декабря 2010

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

Для страницы HTML это должно быть text/html, для XHTML это будет application/xhtml+xml.

0 голосов
/ 26 декабря 2010

Если у вас есть только содержимое (если у вас нет доступа к исходным заголовкам HTTP, как предложил Одед), вы можете предположить, что хорошая строка HTML должна содержать как минимум символ «<», скажем, в 10 первых символах строки. </p>

Конечно, нет никакой гарантии, и вам все равно нужно будет обрабатывать крайние случаи, но это должно отбросить большинство мусора или непредвиденные типы контента и позволит нормально проходить определенные байты кодирования (например, знак порядка байтов UTF-8 и т. Д. ...).

...