• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

VBNETte HTML hata veriyor.

  • Konbuyu başlatan Konbuyu başlatan Orion1
  • Başlangıç tarihi Başlangıç tarihi

Orion1

Uzman
Uzman
Katılım
1 Mart 2005
Mesajlar
22,239
Excel Vers. ve Dili
Win7 Home Basic TR 64 Bit

Ofis-2010-TR 32 Bit
Merhaba.
Haluk üstadın excel için yazmış olduğu webten veri alma kodlarını vbnete uyarlamaya çalıştım.
Ama aşağıdaki resimdeki hatayı verdi.
Nasıl yapmalıyız?
Adsız.jpg
 
Çok isterdim vb.net yüklü değil :(
 
Problemin HTTP mi, yoksa HTML nesnesinde mi olduğu pek anlayamadım. COM nesneleri bazen problem çıkaratabiliyor.

Aşağıdaki gibi kullanın; bakalım durum ne olacak... (Buton click altına yapıştırılacak)

C#:
Dim request As New Net.WebClient

AddHandler request.DownloadStringCompleted, Sub(objSender As Object, message As DownloadStringCompletedEventArgs)
                                                  HTML.body.innerHTML = message.Result
                                            End Sub

request.DownloadStringAsync(New Uri("http://..."))
 
Son düzenleme:
Merhaba;

Evren bey, siz o siteden hangi verileri almak istiyorsunuz? Amacınız html dom verilerini parse etmekse ve Vb.net kullanıyorsanız create.objecte gerek var mı?
webclient veya httpwebrequest ile html response yi alın ve ister regexp ile isterseniz "Html Agility Pack " gibi harika bir 3.parti eklentiyle ilgili html dom verilerini almayı deneyin.

Ütelik requestlerinizde header'a user-agent, referer gibi özellikleri atayabilirsiniz.
 
Problemin HTTP mi, yoksa HTML nesnesinde mi olduğu pek anlayamadım. COM nesneleri bazen problem çıkaratabiliyor.

Aşağıdaki gibi kullanın; bakalım durum ne olacak... (Buton click altına yapıştırılacak)

C#:
Dim request As New Net.WebClient

AddHandler request.DownloadStringCompleted, Sub(objSender As Object, message As DownloadStringCompletedEventArgs)
                                                  HTML.body.innerHTML = message.Result
                                            End Sub

request.DownloadStringAsync(New Uri("http://..."))
Teşekkür ederim hocam.Sanırım HTML de sorun var.Ben yanlış yazdım sanırım.Çünkü HTML kelimesinin üstünü açık mavi yapmış.Yapmaya çalışıcam.Burada bir prosedür var.O ayrı bir prosedür diilmi hocam.Bunu buton click olayı içinemi yazcaz.Yoksa ayrı bir prosedürmü olacak.
 
Son düzenleme:
Merhaba;

Evren bey, siz o siteden hangi verileri almak istiyorsunuz? Amacınız html dom verilerini parse etmekse ve Vb.net kullanıyorsanız create.objecte gerek var mı?
webclient veya httpwebrequest ile html response yi alın ve ister regexp ile isterseniz "Html Agility Pack " gibi harika bir 3.parti eklentiyle ilgili html dom verilerini almayı deneyin.

Ütelik requestlerinizde header'a user-agent, referer gibi özellikleri atayabilirsiniz.
Merhaba beab05 hocam.Teşekkür ederim.
Hocam,VBNET konusunda acemiyim.Söylediklerinizi anlayamadım.
Aşağıdaki resimdeki iptal ettiğim satırdaki gibi veri alıcam.

Adsız.jpg
 
Son düzenleme:
Evren bey size bir örnek yaptım.
https://yorum.altin.in/tum/dolar

bu sitedeki en üstteki verileri çektim.


Adsız.png

Projeyi alta ekliyorum.

Ayrıca sadece exe yi de ekliyorum. Sadece çalışan dosyaya bakmak isteyenler için.. Verialalim rar içinde exe ve ilgili dll var.

Diğer rar zaten kaynak kodlar..
 

Ekli dosyalar

Son düzenleme:
Teşekkür ederim hocam.
Sadece dolar ve altın verisini alsaydım,nasıl bir değişiklik yapacaktım?
 
Teşekkür ederim hocam.
Sadece dolar ve altın verisini alsaydım,nasıl bir değişiklik yapacaktım?

Alttaki gibi en kestirme yoldan olabilir. Basit bir if.. then.. yeter..

Kod:
Private Sub BtnVeriAl_Click(sender As Object, e As EventArgs) Handles BtnVeriAl.Click


        Dim Verilerim As New List(Of Veriler)

        Dim anaurl As String = "https://yorum.altin.in/tum/dolar"

        Dim veriDom As String = "//div[@class='odee']//div"


        Using wd As New WebClient With {.Encoding = Encoding.Default}

            Dim istek = wd.DownloadString(anaurl)

            Dim doc As New HtmlDocument()
            doc.LoadHtml(istek)


            Dim col As HtmlNodeCollection = doc.DocumentNode.SelectNodes(veriDom)


            For Each bb As HtmlNode In col

                Dim childs = bb.ChildNodes

                Dim IstedigimVeri = childs("h1").InnerText.ToString

                'Burada sadece altın ve usd yi aldık. Tabii çok statik bir yöntem. Siz kendiniz bunu geliştirmelisiniz.

                If IstedigimVeri.Equals("ALTIN ONS") Or IstedigimVeri.Equals("USD/TL") Then
                    Verilerim.Add(New Veriler With {.Isim = childs("h1").InnerText, .Deger = childs("h2").InnerText,
                                                     .Zaman = childs("font").InnerText})

                End If
            Next


            GrdSite.DataSource = Verilerim


        End Using

    End Sub
 
Son düzenleme:
Teşekkür ederim hocam.
Bu tamamdır.(y)
 
Yalnız unutmayın;

Web sitelerinden veri aldığınızda ilgili sitelerde yapılan değişkliklerde ki çok sık yapılabilir sizin uygulamalarınız da çalışmaz hale egelebilir. Bu bakımdan ya istediğiniz verileri veren bir api bulun ya da kendiniz sunucuda çalışan istediğiniz verileri döndüren bir web service yazın.
 
Yalnız unutmayın;

Web sitelerinden veri aldığınızda ilgili sitelerde yapılan değişkliklerde ki çok sık yapılabilir sizin uygulamalarınız da çalışmaz hale egelebilir. Bu bakımdan ya istediğiniz verileri veren bir api bulun ya da kendiniz sunucuda çalışan istediğiniz verileri döndüren bir web service yazın.
Anladım hocam.
Teşekkür ederim.
İyi günler dilerim.
 
Evren Bey, ilk mesajınızda adım geçtiği için konuya müdahil olayım dedim....

Yukarıda arkadaşların belirttiği gibi, VS'nin kendi class'larıyla çalışmak çok daha mantıklı.

Ama yine de VBA'de kullandığımız "CreateObject" ile çalışmak isterseniz; oluşturduğunuz HTML Document'a bir şeyler yazdırmadan önce ilk olarak nesneyi açıp, kapatarak nesneyi kullanıma hazır hale getirmek veya "Body" kısmını hazırlamak gerekiyor. Daha sonra, siz HTTP nesnesi ile yolladığınız isteğin dönüşünü yazdırabilirsiniz.

Bunun için ya aşağıdaki gibi bir şey;

Kod:
        If objHTTP.Status = 200 Then
            HTMLfile.Open
            HTMLfile.Close
            HTMLfile.Body.innerHTML = objHTTP.responseText

            Label3.Text = HTMLfile.getelementById("sabitDolar").innerText
            Label4.Text = HTMLfile.getelementById("sabitEuro").innerText
        Else
            MsgBox("Problem var ...!")
        End If

Ya da "Body" oluşturarak; kodun aşağıdaki gibi olması gerekir...

Kod:
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim URL As String
        Dim objHTTP As Object, HTMLfile As Object

        URL = "https://yorum.altin.in/tum/dolar"

        objHTTP = CreateObject("MSXML2.XMLHTTP")
        objHTTP.Open("GET", URL, False)
        objHTTP.Send

        HTMLfile = CreateObject("HTMLFILE")

        If objHTTP.Status = 200 Then
            HTMLfile.Open
            HTMLfile.Write("<body></body>")
            HTMLfile.Close
            HTMLfile.Body.innerHTML = objHTTP.responseText

            Label3.Text = HTMLfile.getelementById("sabitDolar").innerText
            Label4.Text = HTMLfile.getelementById("sabitEuro").innerText
        Else
            MsgBox("Problem var ...!")
        End If
    End Sub


Örnek proje ektedir ....


.
 

Ekli dosyalar

Son düzenleme:
Merhaba ben proğramlarımı hep vb6 da yapıyordum
vb net için bir dosyada ben ekliyorum.

Yeni Bit Eşlem Resmi.jpg
 

Ekli dosyalar

Haluk hocam;
Bu kodlarda çok güzel oldu.(y)
Teşekkür ederim.
 
Halit bey;
Sizin kodlarınızda çok güzel olmuş.(y)
Teşekkür ederim.
 
Haluk hocam;
Bir şey daha sormak istiyorum.
Label1 ve label2 text lerini manuel yazılmış.(altın ve dolar)
Onlarıda kod ile aldırabilirmiyiz?
 
Geri
Üst