Получение данных веб страницы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Получение данных веб страницы

Сообщение alibek » 26.02.2010 (Пт) 15:39

Kytx писал(а):При этом на обработчик ошибок "On Error Resume next" не реагирует. Как от них можно избавиться?

В настройках браузера выключи отладку скриптов.
Lasciate ogni speranza, voi ch'entrate.

Kytx
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 26.07.2004 (Пн) 18:43

Re: Получение данных веб страницы

Сообщение Kytx » 26.02.2010 (Пт) 17:34

Спасибо за помощь. Разобрался. Теперь всё, что нужно, считывается из таблицы в массив.
Код получился следующий. Если кто-нибудь сможет предложить оптимизацию, буду рад совету.

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

Public Type Type_Paramers
    Name As String
    Description As String
    Value As Variant
End Type

Dim Parametrs() As Type_Paramers

Sub DataFromHTML(FilePath As String)
    Dim nFreeFile As Integer
    Dim i As Long
    Dim Doc As Object
   
    nFreeFile = FreeFile
    Open FilePath For Input As nFreeFile
    Set Doc = CreateObject("HTMLFile")
    Doc.Write input(FileLen(FilePath), #nFreeFile)
    Close nFreeFile
   
    ReDim Preserve Parametrs(100)
   
    Set TableHTML = Doc.body.getElementsByTagName("Table").Item(1).getElementsByTagName("TBODY").Item(0)
    For Each TrHTML In TableHTML.getElementsByTagName("TR")
        i = i + 1
        Parametrs(i).Name = TrHTML.getElementsByTagName("TD").Item(0).getElementsByTagName("A").Item(0).innerText
        Parametrs(i).Description = TrHTML.getElementsByTagName("TD").Item(0).getElementsByTagName("DIV").Item(0).innerText
        Parametrs(i).Value = TrHTML.getElementsByTagName("TD").Item(1).innerText
    Next
    ReDim Preserve Parametrs(i)
End Sub

Последний раз редактировалось Kytx 26.02.2010 (Пт) 18:33, всего редактировалось 1 раз.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Получение данных веб страницы

Сообщение alibek » 26.02.2010 (Пт) 17:42

1. Зачем считывать содержимое файла в переменную?
2. Зачем ты делаешь Doc.Open и Doc.Close?
3. ReDim Preserve нужно делать только один раз. Задавай массив с запасом перед циклом, а после цикла обрезай по нужному количеству элементов.
Lasciate ogni speranza, voi ch'entrate.

Kytx
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 26.07.2004 (Пн) 18:43

Re: Получение данных веб страницы

Сообщение Kytx » 26.02.2010 (Пт) 18:35

alibek писал(а):1. Зачем считывать содержимое файла в переменную?
2. Зачем ты делаешь Doc.Open и Doc.Close?
3. ReDim Preserve нужно делать только один раз. Задавай массив с запасом перед циклом, а после цикла обрезай по нужному количеству элементов.


Спасибо за советы, код подправил в предыдущем посте.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Получение данных веб страницы

Сообщение kibernetics » 15.02.2013 (Пт) 14:48

А почему может возникать на этом участке ошибка?
Код: Выделить всё
    nFreeFile = FreeFile
    Open FilePath For Input As nFreeFile
    Set Doc = CreateObject("HTMLFile")
    Doc.Write input(FileLen(FilePath), #nFreeFile) '<--- ОШИБКА ТУТ Input past end of file (Error 62).
    Close nFreeFile


Хочу загрузить обычный html -файл.

П.С. Начал полайново смотреть файл, обнаружил, что вначале стоят 2 символа 255 и 254, я так понимаю нули... Думаю, дело в них.
Может есть идея как считать файл в переменную, начиная с позиции 3?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Получение данных веб страницы

Сообщение iGrok » 15.02.2013 (Пт) 16:49

kibernetics писал(а):вначале стоят 2 символа 255 и 254, я так понимаю нули

Это не нули, это Unicode Byte Order Mark (BOM).
label:
cli
jmp label

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Получение данных веб страницы

Сообщение kibernetics » 15.02.2013 (Пт) 17:13

iGrok писал(а):
kibernetics писал(а):вначале стоят 2 символа 255 и 254, я так понимаю нули

Это не нули, это Unicode Byte Order Mark (BOM).


Я думаю, что надо делать функцию Trim, но как её задействовать, если файл уже есть?
Получается, что можно только начать считывать с конкретной позиции и до конца?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Получение данных веб страницы

Сообщение iGrok » 17.02.2013 (Вс) 22:47

Просто не нужно использовать input для чтения таких файлов.

Получить содержимое файла в строку можно, например, так:
Код: Выделить всё
Dim s As String
Dim b() As Byte

nFreeFile = FreeFile
Open FilePath For Binary As nFreeFile
ReDim b(FileLen(filepath))
Get #nff, , b
s = b
Close nFreeFile


А дальше попробуй эту строку скормить документу, и посмотри, что получится.
label:
cli
jmp label

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.02.2013 (Вс) 22:52

iGrok писал(а):s = b

Неужели такое присваивание прокатит для юникодного файла? :shock:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Получение данных веб страницы

Сообщение alibek » 18.02.2013 (Пн) 9:14

А почему нет? Если файл конечно UTF-16.
Lasciate ogni speranza, voi ch'entrate.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Получение данных веб страницы

Сообщение arthur2 » 18.02.2013 (Пн) 9:19

Qwertiy А то :)
iGrok только ReDim b(FileLen(filepath)-1)А то в конце строки будет лишний байт. А ещё лучше - ReDim b(FileLen(filepath)-3) и читать файл с третьего байта - чтобы сигнатуру пропустить
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Получение данных веб страницы

Сообщение iGrok » 18.02.2013 (Пн) 21:14

Qwertiy писал(а):Неужели такое присваивание прокатит для юникодного файла?

Если вспомнить, что при таком присваивании никакой конвертации не производится, а строки в VB6 юникодные - то почему нет?

Вот если бы там был не юникод, нужно было бы применять StrConv.

arthur2 писал(а):только ReDim b(FileLen(filepath)-1)А то в конце строки будет лишний байт. А ещё лучше - ReDim b(FileLen(filepath)-3) и читать файл с третьего байта - чтобы сигнатуру пропустить

Каюсь, байтик вычесть забыл. :oops:

А вот насчёт сигнатуры вопрос спорный. Я бы для начала вообще не стал ничего конвертировать в строку, а скормил бы этому объекту "сырой" массив байт. Если не поймёт, тогда уже придётся самому следить за сигнатурой, различать utf-8, utf-16(и ucs-2) и ascii... Но мне почему-то кажется, что он сам должен уметь работать с кодировками.
label:
cli
jmp label

Пред.

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

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

Сейчас этот форум просматривают: AhrefsBot, Mail.ru [бот] и гости: 80

    TopList