Не получается с www.google.ru дёрнуть текст через XmlHttp.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Не получается с www.google.ru дёрнуть текст через XmlHttp.

Сообщение ALX_2002 » 19.11.2007 (Пн) 19:57

Доброго времени суток товарищи. Долблюсь уже пол дня, не выдержал, решил к вам обратиться.

В VBS-ке xерез XmlHttp дёргаю данные с сайтов. Получив ResponseBody конвертирую его текст через ADODB.Stream, а потом загоняю в HTMLDocument

Проблема в том, что на Yandex-е, Rambler-e кодировка Windows-1251, а на гугле UTF-8 и вместо нормального текста я получаю крякозяблы.

В голову не приходит как доделать код, чтоб добиться нормального текста. Если в Stream подсовываю UTF-8 то для гугла всё нормально пашет, а для Yandex-a естессено всё портится. Посоветуйте как быть плз. :roll:

Код: Выделить всё

Dim UrlDownloader

Set UrlDownloader = New UrlDownloaderClass

if UrlDownloader.UrlToDocument("http://www.ya.ru",Document) Then
   MsgBox Document.body.outertext
Else
   MsgBox Err.Description,vbExclamation
End if

if UrlDownloader.UrlToDocument("http://www.google.ru",Document) Then
   MsgBox Document.body.innertext
Else
   MsgBox Err.Description,vbExclamation
End if

Class UrlDownloaderClass
   Private XmlHttp

   Public Status

   Private Sub Class_Initialize
      Set XmlHttp = CreateObject("Msxml2.XMLHTTP")
   End Sub

   Function UrlToDocument(URL,HTMLDocument)
      On Error Resume Next
      XmlHttp.abort
      XmlHttp.Open "GET",Url,False
      XmlHttp.Send      

      Status = XmlHttp.Status

      If XmlHttp.Status = 200 Then
         Set Stream = CreateObject("ADODB.Stream")

         Stream.Charset = "Windows-1251"
         Stream.Type = 1
         Stream.Open
         Stream.Write XmlHttp.ResponseBody
         Stream.Position = 0      
         Stream.Type = 2
         
         Set HTMLDocument = CreateObject("HTMLFile")
         HTMLDocument.Open
         HTMLDocument.write "<HTML><BODY></BODY></HTML>"
         HTMLDocument.body.innerhtml = Stream.ReadText
         HTMLDocument.Close
      End if

      UrlToDocument = Not Cbool(Err.Number)
   End Function

   Private Sub Class_Terminate
      Set XmlHttp = Nothing
      Set XmlDom = Nothing
   End Sub
End Class

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 19.11.2007 (Пн) 20:03

Ручками распарсить начало документа и посмотреть кодировку
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 19.11.2007 (Пн) 21:18

keks-n писал(а):Ручками распарсить начало документа и посмотреть кодировку


Усё понял. :) Пасиб. Ушёл творить ))

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 22.11.2007 (Чт) 0:39

Вот что получилось :) Вдруг кому нить пригодится.

С автоматическим определением кодировки

Пример дёргает погоду с www.rambler.ru

Код: Выделить всё


Dim UrlDownloader

Set UrlDownloader = New UrlDownloaderClass

if UrlDownloader.UrlToDocument("http://www.rambler.ru",Document) Then
   Set Tables = Document.all.tags("TABLE")

   For TableIndex=1 to Tables.Length-1
      if Instr(LCase(Tables(TableIndex).innertext),"погода:") Then
         if LCase(Tables(TableIndex).ClassName)="gradgrey2" Then
            TextBuffer = TextBuffer & Tables(TableIndex).innertext & vbCrlf
            For Each TR in Tables(TableIndex+2).Rows
               For Each TD in TR.Cells
                  if TD.innerText <> "" Then
                     TextBuffer = TextBuffer & " " & TD.innertext
                  End if
               Next
               TextBuffer = TextBuffer & vbCrlf
            Next
         End if
      End if
   Next

   MsgBox TextBuffer
Else
     MsgBox URL,vbExclamation,Err.Description
End if

Class UrlDownloaderClass
    Private XmlHttp
   Private Stream
   
   Public cache
      
    Public Status

    Private Sub Class_Initialize
            Set XmlHttp = CreateObject("Microsoft.XMLHTTP")
         Set Stream = CreateObject("ADODB.Stream")
    End Sub

    Function UrlToDocument(URL,HTMLDocument)
        On Error Resume Next

        XmlHttp.abort

      XmlHttp.Open "GET",Url,False

      If Not cache then
            XmlHttp.setRequestHeader "Cache-Control", "no-cache"
      End if

      XmlHttp.Send           

      Status = XmlHttp.Status

      Set HTMLDocument = CreateObject("HTMLFile")

      HTMLDocument.Open

      HTMLDocument.write "<HTML><BODY></BODY></HTML>"

      Charset = HTMLDocument.defaultcharset

      If XmlHttp.Status = 200 Then

      Groups = Split(XmlHttp.GetResponseHeader("Content-type"))
         
      For Each Group in Groups
         Params = Split(Group,"=")
         if LCase(Params(0))="charset" then Charset = Params(1)
      Next

            Stream.Charset = Charset
            Stream.Type = 1
            Stream.Open
            Stream.Write XmlHttp.ResponseBody
            Stream.Position = 0             
            Stream.Type = 2
            HTMLDocument.body.innerhtml = Stream.ReadText
         Stream.Close
        End if

   HTMLDocument.Close

   UrlToDocument = Not Cbool(Err.Number)
    End Function
End Class


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 68

    TopList  
cron