2014-09-30 4 views
0

У меня есть файлы, которые были отображены в режиме просмотра, а затем я использовал File, Save As .., чтобы поместить текст в локальный файл. На странице есть несколько сценариев, и она не будет отображаться правильно в WebBrowserControl в WinForm. Проблема заключается в том, что скрипты, поскольку в элементе управления отображаются диалоги ошибок сценария. Мне действительно не нужно просматривать файл, но просто получить несколько элементов по идентификатору.Прочитать HTML-файл в VB.Net

Первый блок кода ниже загружает файл в локальный объект, но только первые 4096 байт. (То же самое происходит, если я использую WebBrowser житель на форме.)

Второй блок не жалуется, но GetElementByID терпит неудачу как искомый элемент находится за пределами первого 4096.

Dim web As New WebBrowser 
    web.AllowWebBrowserDrop = False 
    web.ScriptErrorsSuppressed = True 
    web.Url = New Uri(sFile) 

    Dim doc As HtmlDocument 
    Dim elem As HtmlElement 
    doc = web.Document 
    elem = doc.GetElementById("userParts") 

Что я делаю неправильно?

Есть ли лучший способ для проекта VB.Net WinForm для загрузки HTML-документа, из которого я могу читать элементы?


Я просто пошел с строковыми функциями для простой задачи под руку:

Function GetInnerTextByID(html As String, elemID As String) As String 
    Try 
     Dim s As String = html.Substring(html.IndexOf("<body>")) 
     s = s.Substring(s.IndexOf(elemID)) 
     s = s.Substring(s.IndexOf(">") + 1) 
     s = s.Substring(0, s.IndexOf("<")) 
     s = s.Replace(vbCr, "").Replace(vbLf, "").Trim 
     Return s 
    Catch ex As Exception 
     Return "" 
    End Try 
End Function 

я бы до сих пор заинтересован в подходе родную VB.Net (не ASP). Или почему OP загружает только 4096 байт.

+0

Вы можете использовать ['HtmlAgilityPack'] (http://htmlagilitypack.codeplex.com/) –

+0

Правда - но слишком сложная для моего простого t попросите извлечь несколько элементов по идентификатору. – rheitzman

+1

Он также имеет метод document.GetElementById, который довольно прост. И у него нет никаких странных проблем со сценариями или байтами. Просто загрузите документ из сети, файла или обычной строки. –

ответ

2

Вместо этого я бы использовал HtmlAgilityPack.

Вы: «Правда, но слишком сложна для моей простой задачи по извлечению нескольких элементов по идентификатору».

У этого метода также есть document.GetElementbyId, который довольно прост. И у него нет никаких странных проблем со сценариями или байтами. Просто загрузите документ из Интернета, потока, файла или из простой строки.

Например (веб):

Dim document As New HtmlAgilityPack.HtmlDocument 
Dim myHttpWebRequest = CType(WebRequest.Create("URL"), HttpWebRequest) 
myHttpWebRequest.UserAgent = "Mozilla/5.0 (compat ble; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)" 
Dim streamRead = New StreamReader(CType(myHttpWebRequest.GetResponse(), HttpWebResponse).GetResponseStream) 
Dim res As HttpWebResponse = CType(myHttpWebRequest.GetResponse(), HttpWebResponse) 
document.Load(res.GetResponseStream(), True) 

Dim node As HtmlNode = document.GetElementbyId("userParts") 

или из файла:

document.Load("Path") 

или из строки (Fе целый веб-страницы в HTML-файл прочитан File.ReadAllText):

document.LoadHtml("HTML") 
Смежные вопросы