VB.NET Webbrowser.Document - то, что вы видите, не то, что вы можете получить - PullRequest
0 голосов
/ 02 февраля 2012

Мои попытки написать простой сканер, похоже, смущены тем фактом, что моя целевая веб-страница (как будет отображаться в элементе управления браузера UI или через обычное приложение браузера) не полностью доступна в виде HTMLDocument (из-за фреймов,javascript и т. д.)

Приведенный ниже код выполняется, и правильная веб-страница (например, отображающая элементы 50–59) может даже отображаться в элементе управления, но где я ожидаю получить гиперссылку «следующая страница»чтобы быть «... & start = 60», я вижу кое-что еще - то, что соответствует открытию первой страницы каталога «... & start = 10».Странно то, что если я нажму кнопку еще раз, я получу то, что ищу.Даже странно, если я вставлю MsgBox, скажу сразу после того, как я зациклился на ожидании, пока WebBrowserReadyState.Complete, тогда я получу то, что ищу.

Private Sub ButtonGo_Click(sender As System.Object, e As System.EventArgs) Handles ButtonGo.Click
    'start at this URL
    'e.g. http://www.somewebsite.com/properties?l=Dallas+TX&co=US&start=50
    catalogPageURL = TextBoxInitialURL.Text
    WebBrowser1.Navigate(catalogPageURL)
    While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
        Application.DoEvents()
    End While
    'Locate the URL associated with the NEXT>> hyperlink
    Dim allLinksInDocument As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("a")
    Dim strNextPgLink As String = ""
    For Each link As HtmlElement In allLinksInDocument
        If link.GetAttribute("className") = "next" Then
            strNextPgLink = link.GetAttribute("href")
        End If
    Next
End Sub

Я достаточно погуглилпопробовать что-то вроде использования события WebBrowser1.DocumentCompleted, но это все равно не сработало.Я попытался вставить команды сна.

Я избегал использования WebClient и регулярных выражений, как я обычно это делал, потому что я убежден, что использование DOM будет проще для других вещей, которые я запланировалв будущем, и я знаю HTML Agility Pack, но не достаточно амбициозен, чтобы изучить его.Поскольку кажется, что должен быть простой способ синхронизировать этот dang webbrowser.document объект с тем, что вы действительно можете увидеть.

Если это из-за javascript, есть ли способ, которым я могу сказать веб-браузеру:просто выполнить их все?

Первый вопрос на форуме, с нетерпением жду еще (умнее, надеюсь)

1 Ответ

0 голосов
/ 06 марта 2013

Будьте внимательны при использовании webbrowser1. Документ или что-то подобное - вы не получите «сырой HTML»

Пример: (предположим, что wbMain - это веб-браузер)

    RTB_RawHTML.Text = wbMain.DocumentText
    Try
         RTB_BodyHTML.Text = wbMain.Document.Body.OuterHtml
    Catch
         debugMessage("Body tag not found.")
    End Try

в этом примере код в теге body, отображаемый в части тега body RTB_RawHTML, НЕ будет полностью соответствовать html, как показано в RTB_BodyHTML. Доступ к нему через (yourwebbrowserhere) .Document.Body.OuterHtml, по-видимому, несколько «очищает» его, в отличие от «необработанного» html, полученного (yourwebbrowserhere) .DocumentText

Это было проблемой для меня, когда я делал веб-скребок, так как это постоянно отбрасывало меня - иногда я пытался найти совпадение с тегом, и он находил его, а иногда - нет, хотя я был в этом уверен. был здесь. Причина была в том, что я пытался сопоставить необработанный HTML, но мне нужно было сопоставить с «очищенным» HTML.

Я не уверен, поможет ли это вам изолировать проблему или нет - для меня это произошло.

...