powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как получить объект вместо ссылки на него?
4 сообщений из 4, страница 1 из 1
Как получить объект вместо ссылки на него?
    #38479240
cynep kopoBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня!
Приключился у меня следующий конфуз: создал я под определенные задачи потокобезопасную несортированную коллекцию
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Imports System.Collections.Concurrent

Module declarations
    Public cb1Pages As New ConcurrentBag(Of HtmlDocument)
    Public cbUrls As New ConcurrentBag(Of String)
...
...
...
End Module



И стал наполнять ее всяким разным добром
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Imports System.Threading

Public Class Form1
    Private WithEvents wb As New WebBrowser
    Private uc As New _1stCollector
    Private thUrl As Thread
    ...
    ...

    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        ...
        thUrl = New Thread(AddressOf uc.GStart)
        thUrl.IsBackground = True
        thUrl.Start()
        wb.Navigate("https://www.google.ru/search?q=" & TextBox1.Text.Replace(" ", "+"), False)
    End Sub

    Private Sub wb_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles wb.DocumentCompleted
        cb1Pages.Add(wb.Document)

        Dim nxt As HtmlElement = wb.Document.GetElementById("pnnext")
        If Not nxt Is Nothing Then
            nxt.InvokeMember("click")
        End If
    End Sub
End Class



Однако, при попытке воспользоваться сохраненными данными, выхватываю ошибку
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Imports System.Collections.Concurrent
Imports System.Threading

Public Class _1stCollector
    Public Sub GStart()
        While True
            Try
                If Not cb1Pages.IsEmpty Then
                    Dim coll_doc As HtmlDocument
                    If cb1Pages.TryTake(coll_doc) Then
                        For Each elem As HtmlElement In coll_doc.GetElementById("rso").GetElementsByTagName("h3")  '' ругается здесь
                            For Each alem As HtmlElement In elem.GetElementsByTagName("a")
                                cbUrls.Add(alem.GetAttribute("href"))
                                Console.WriteLine(alem.GetAttribute("href"))
                            Next
                        Next
                    End If
                End If
                Thread.Sleep(200)
            Catch ex As Exception
                Console.WriteLine("1st " & ex.Message)
            End Try
        End While
    End Sub
End Class



Окно вывода:
1st Ссылка на объект не указывает на экземпляр объекта.
1st Ссылка на объект не указывает на экземпляр объекта.
1st Ссылка на объект не указывает на экземпляр объекта.
1st Ссылка на объект не указывает на экземпляр объекта.
1st Ссылка на объект не указывает на экземпляр объекта.
...
...
...

Но иногда проходит нормально и парсит вполне корректно. Подскажите, в чем может быть затык? У меня совсем не осталось идей.

ЗЫ: Парсить сразу после загрузки страницы до начала загрузки следующей получается, но это не то, что требуется. В идеале все должно происходить в одно время в разных потоках.
...
Рейтинг: 0 / 0
Как получить объект вместо ссылки на него?
    #38479339
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cynep kopoBka,

А Вы уверены, что Вам всегда возвращается объект вот здесь: coll_doc.GetElementById("rso") ?
...
Рейтинг: 0 / 0
Как получить объект вместо ссылки на него?
    #38479363
cynep kopoBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за внимание.
Вопрос решил через mshtml и интерфейсы IHTMLDocument2 , IHTMLElement2 и IHTMLElement .
...
Рейтинг: 0 / 0
Как получить объект вместо ссылки на него?
    #38479370
cynep kopoBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsov,

coll_doc не был объектом. Перерыв System.Windows.Forms.HTMLDocument, я так и не нашел способа его создания "с нуля". А в mshtml такое есть:

Код: vbnet
1.
Dim coll_doc As IHTMLDocument2 = DirectCast(New HTMLDocument, IHTMLDocument2)


После чего, методом write в него можно записать HTML-внутренности
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как получить объект вместо ссылки на него?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]