Конвертирование HTML в TXT или RTF

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
dr-vic
Обычный пользователь
Обычный пользователь
 
Сообщения: 65
Зарегистрирован: 13.01.2004 (Вт) 0:05

Конвертирование HTML в TXT или RTF

Сообщение dr-vic » 13.01.2004 (Вт) 16:34

Подскажите, если кто может, нет ли способов перекодировки
файлов HTML, содержащих скрипты в TXT или RTF не прибегая к загрузке Word или Web Browser?
Заранее благодарен...

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 13.01.2004 (Вт) 16:40

Хм... Странный вопрос... Ну можно попробовать через XML+XSL - только я слабо представляю себе какого объема и сложности д.б. стайлшит :)

В общем я скажу - можно, но трудозатрат будет очень много.

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 14.01.2004 (Ср) 17:16

На самомо Vbstreets есть такой пример точно, помню (по крайней мере на старом сайте)
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

dr-vic
Обычный пользователь
Обычный пользователь
 
Сообщения: 65
Зарегистрирован: 13.01.2004 (Вт) 0:05

Сообщение dr-vic » 21.01.2004 (Ср) 9:13

Вопрос покажется не слишком странным, если
иметь категорическое нежелание некоторых индивидов
иметь на своём компе MSWord.
По поводу Веб Броузера - может я конечно не прав,
но нормальное присоединение библиотеки Microsoft HTML
Object Library (MSHTML.DLL) через references получается
только для VBA, для VB у меня присоединяется только
MSHTML.TLB - а у нее свойств .body.InnerText ,
.body.InnerHTML итп. просто нет. Если я что-то неправильно
делаю или ошибаюсь - напишите.
Я смотрел на многих ресурсах - но ничего такого
нигде нет. Нашел только на CodeGuru.com, но и там
дали только способ через объект Word и еще один -
через свой OCX - который просто не работает.
Я совершенно не имею иллюзий по поводу объёма
трудозатрат - свой конвертор для "гладкого" HTML
я написал, но когда начинаются скрипты - начинается
и головная боль. Так что по поводу средств XML -
если можно по конкретнее.
К стати, я специально снова пролистал весь VBStreet и
ничего не нашел.

Gena
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 05.02.2004 (Чт) 9:20
Откуда: Кременчуг

Сообщение Gena » 05.02.2004 (Чт) 9:26

Да, но свойства .body.InnerText есть у HTMLDocument (Microsoft HTML
Object Library) :lol:

dr-vic
Обычный пользователь
Обычный пользователь
 
Сообщения: 65
Зарегистрирован: 13.01.2004 (Вт) 0:05

Сообщение dr-vic » 13.02.2004 (Пт) 23:20

To GENA:
Спасибо за ответ, но, дело в том, что я пробовал
работать с этой библиотекой, но у меня получилась
полная фигня.Я пишу что-то типа:

Dim htmlDoc as new MSHTML.HTMLDocument
htmlObj = htmlDoc.open("anyHTML.htm")

На это появляется:
Run-time error 430
Class does not support Automation....

К стати, такая же ошибка появляется при попытках
воспользоваться любой другой функцией или процедурой,
из приведенных для HTMLDocument в ObjectBrowser.
Поэтому я и спрашиваю: может я что-нибудь неправильно
делаю? Или может у меня VB дефективный?
(К стати, пишется на VB6, вроде бы стандартном).

Если можно, подскажи, в чем я напутал.
Заранее спасибо.

young
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 19.06.2003 (Чт) 15:12
Откуда: Липецк

Сообщение young » 14.02.2004 (Сб) 12:36

dr-vic
Нужно выбросить всё, что имеет в текстовом виде вид <***>, <br> заменить на chr(10)+chr(13).... Но, если страница будет иметь структуру таблицы, там уже будут интересные вещи....
Я прдлагаю, в таком случае, создать массив где "нарисовать" эту таблицу, согласно полученной "карте" заполнить текст, а всё остальное набить пробелами....

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.02.2004 (Сб) 14:05

Ну насчёт "забивания всего остального пробелами" я бы поостерёг :)

У меня в Блокноте псевдографика глючно смотрится, т.к. все шрифт не моноширинный. Забейте на таблицы в txt вообщем :)

young
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 19.06.2003 (Чт) 15:12
Откуда: Липецк

Сообщение young » 16.02.2004 (Пн) 16:24

Amed Не.... Таблицы не в коем случае игнорировать нельзя! Их псевдо сторить. Ща попробую чё-нить сделать, мож получится, а мож и нет!

Lobo
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 08.01.2004 (Чт) 16:49
Откуда: Таллинн, Эстония

Сообщение Lobo » 16.02.2004 (Пн) 18:10

По-моему, здесь статья на эту тему. :?:
Изображение Вопросы - рёбрами!

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 16.02.2004 (Пн) 18:28

Чего то я не догоняю, тебе только текст нужен из HTML файлов?
Если да, то HTML Object Library это все что тебе нужно.

Dim IE1 As InternetExplorer
Dim objHTML as Variant
Dim RezultText As String

Set IE1 = New InternetExplorer
IE1.Navigate "anyHTML.htm"

Do Until IE1.ReadyState = READY_STATE_COMPLITE 'Может и по другому писаться лень смотреть, но она сама выскочит когда код писать будешь
DoEvents
Loop

Set objHTML = IE1.Document.All.Tag("BODY")

RezultText = objHTML.InnerText

Set IE1 = Nothing

Ну и можешь сохранять ролученный текст куда тебе вздумается.
Если руки кривые, то не надо ругать разработчиков.

dr-vic
Обычный пользователь
Обычный пользователь
 
Сообщения: 65
Зарегистрирован: 13.01.2004 (Вт) 0:05

Сообщение dr-vic » 16.02.2004 (Пн) 23:07

XRaptor: по поводу internet explorer погляди все-таки, как задан вопрос, тогда и догонишь!

Lobo: спасибо за ссылку, но разобраться еще не успел - по английски медленно читаю!

Young и Ahmed: я, в общем-то, и сам пошел по этому пути, только у
меня сначала ловится начало тэга "<", анализируется сам тэг до окончания, а после убирается "хвост" тэга. Все работает, но
а.обрабатывет корректно не все файлы, из-за разнообразия тэгов, скриптов и т.д. Тут приходится изголяться с накоплением библиотечки этих самых тэгов и скриптов.
б.на больших файлах заметно притормаживает
в.и вообще как-то неизящно
В следующий раз выложу код, гляньте сами, а вот если есть какие-нибудь идейки на этот счет....

PS. Абсолютно согласен с Ahmed, что таблицы, списки и прочее подобное все-таки необходимо обрабатывать, а не забивать!

Lobo
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 08.01.2004 (Чт) 16:49
Откуда: Таллинн, Эстония

Сообщение Lobo » 17.02.2004 (Вт) 10:26

Я так понимаю, ты сам делаешь HTML-анализатор, то есть наполовину браузер. Но ведь тебе интернет эксплорер или там скажем мозиллу не перещеголять! Почему же не воспользоваться готовым решением?
Изображение Вопросы - рёбрами!

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 17.02.2004 (Вт) 12:02

У тебя в вопросе ничего нет про IE. А если ты не можешь отличить WebBrowser от IE то вообще не знаю как ты собрался что-то писать. И в моем примере IE не отображается на экране, ты даже и не узнаешь когда он загрузится и когда закончит работу, просто его контэйнер выступает как средство для обработки тэгов и усе :-)))
Если руки кривые, то не надо ругать разработчиков.

young
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 19.06.2003 (Чт) 15:12
Откуда: Липецк

Сообщение young » 19.02.2004 (Чт) 20:03

dr-vic Блин. Неуж-то так трудно? Короче, сам тэг нужно анализировать тока на наличие открывающего JavaScr. тэга, если таковой ищем закрывающий и удаляем всё между ними (хотя там может содержаться текст :-( )Также поступаем и с аплетами. Но эт всё не то - нужно в окне браузера обрабатывать, а потом копировать - оптимальный вариант - зря не хочешь!

dr-vic
Обычный пользователь
Обычный пользователь
 
Сообщения: 65
Зарегистрирован: 13.01.2004 (Вт) 0:05

Сообщение dr-vic » 24.02.2004 (Вт) 23:33

To XPraptor: Послушай, не кипятись! Я не хотел тебя обидеть, так что, если
мой ответ показался тебе слишком резким - извини! Ты уж тоже на меня не
наезжай: наверное, если здесь бываю, то что-нибудь и как-нибудь пишу и могу!
Так что, давай уж без обид.
А по поводу темы, ты сам уже наверное понял, что из HTML мне нужен не
только текст (хотя и он тоже). В первую голову нужны правильно
отформатированные табличные данные (не слепленные в сплошную строку),
желательны правильные разделения списков и содержимое гиперссылок.
Форматирование строк по шрифту и цвету тоже было бы не лишним. Поэтому
и извращаюсь.
А по поводу твоего кода, давай разберемся вместе.
Для начала, как я понял необходимо еще подключить Microsoft Internet
Controls (тип данных InternetExplorer). Так?
Дальше вроде все гладко (там правильно READYSTATE_COMPLETE, но это так).
А вот со строкой
Set objHTML = IE1.document.All.Tag("BODY")
я не совсем понял. На нее выскакивает "Object doesn't support this property
or method". То есть .Tag("BODY") по идее должен возвращать содержимое
BodyText-а? У меня нет MSDN, а по сети его читать несколько накладно, а из
ObjectBrowser ничего толкового извлечь не могу. Так что, если не в лом -
объясни по-подробнее!
Заранее благодарен.

PS. To Lobo. Что ты! Куда уж мне с Модзиллой итп тягаться! Тем более, что
мне нужна не самая большая часть того, что умеют монстры. А причины моего
интереса к разбору тэгов "вручную" я только что написал, но все равно спасибо!

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 25.02.2004 (Ср) 12:27

Да ладно, проехали, я и сам погорячился. Вообщем с кодом сорри, я по памяти писал, поэтому синтаксис нарушен в строке
Set objHTML = IE1.document.All.Tag("BODY") не Tag а Tags
Set objHTML = IE1.document.All.Tags("BODY")

А в референсах не Microsoft Internet Controls а Microsoft HTML Object Library.


по этому же принципу выбираешь все нужные тебе данные
IE1.document.All.Tags("TABLE") для таблиц
IE1.document.All.Tags("FONT") для шрифтов
IE1.document.All.Tags("A") для ссылок ....

Например выбрал ты таблицы, ну и начинаешь циклом прогонять все их For Each Next для получения строк создаешь еще объект вариант и теперь сетишь ему строки таблицы

Set RowVariant = objHTML.All.Tags("TR")
ну и так далее сетишь все что тебе нужно по уровням ниже и ниже как входят тэги друг в друга.

Короче принцп простой, только тебе нужно хэлп по HTML всегда открытым держать, потому как свойства и методы этих объектов не присутствуют в ObjectBrowser и не всплывают автоматически их нужно правильно писать по памяти из хэлпа хтмльного.
Если руки кривые, то не надо ругать разработчиков.

Lobo
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 08.01.2004 (Чт) 16:49
Откуда: Таллинн, Эстония

Сообщение Lobo » 25.02.2004 (Ср) 12:53

Я так понимаю, ты всё же интересуешься использованием Internet Explorer как ActiveX сервера. Если ещё учесть, что ты пока не определился с выходным форматом (он может ещё меняться), то, видимо, грамотнее было бы преобразовать HTML в XML (прочитать в DOM - то, что предлагает XPraptor и оттуда записать в XML), а потом с помощью XSL уже делать любой формат. Похожий пример есть в исходном коде к книге: http://www.libertyassociates.com/pages/files/xwdfs.zip.
Изображение Вопросы - рёбрами!

dr-vic
Обычный пользователь
Обычный пользователь
 
Сообщения: 65
Зарегистрирован: 13.01.2004 (Вт) 0:05

Сообщение dr-vic » 28.02.2004 (Сб) 17:36

XPRaptor: Спасибо за подсказку!
Правда у меня все равно к тебе несколько вопросов, но сначала как я
все это среализовал сам:
в референсах - Microsoft HTML Object Library и (все-таки) Mocrosoft
Internet Controls. Поясняю: как я понял HTML Object Library содержатся
как раз объектная модель для обработки уже открытого HTML документа,
средств же для самого открытия я не обнаружил. Для этого я открываю
объект InternetExplorer из Internet Controls, а потом этот объект
уже обрабатываю.
То есть, как и у тебя:
Dim IE1 As InternetExplorer
Dim IEDoc As Object 'можно и Variant - не принципиально
Dim LinkObject As HTMLLinkElement
Dim BodyText As String
Dim TitleText As String
Dim URLText As String
Set IE1 = New InternetExplorer
IE1.navigate htm
Do Until IE1.readyState = READYSTATE_COMPLETE
'кажется можно и .DocumentComplete, но я сам не возился
DoEvents
Loop
Set IEDoc = IE1.document
а дальше немного отличается:
BodyText=IEDoc.body.innerText
Ну - это попса, и доп. возможности:
TitleText=IEDoc.Title 'заголовок
URLText = IEDoc.URL
для ОнЛайна можно протокол
Protocol=IEDoc.protocol
для гиперссылок совершенно верно пишешь - в цикле,
куда-нибудь в текстбокс:
For Each LinkObject In IEDoc.links
Text1 = Text1 & LinkObject.toString & " " & LinkObject.innerText & vbCrLf
Next
Почти тоже самое для таблиц, списков и т.д., но там
чуть похитрее, сейчас разбираюсь.
К стати, там еще есть тип HTMLRichtextElement - звучит многообещающе,
но я еще не разобрался.
Собственно говоря, это, похоже, просто различные
записи одного и того же, но в твоем коде я получаю объект, а текст из него
еще нужно как-то вынуть. Однако твой код мне кажется
более гибким, поскольку не нужно вводить объектные
типы для каждого тэга. Кроме того, если я правильно
понял, Internet Controls ты вообще не подключаешь?
А как тогда .navigate делать?
Если не сложно, объясни сам или хотя-бы кинь ссылочку,
где ты все это прочитал. Еще раз спасибо.

Lobo: большущее благодарю за книгу! Я просмотрел все:
похоже может оказаться весьма полезным. Но с XML я знаком
достаточно поверхностно. Так что, почитаю руководства
и разберусь. В книге выглядит, в основном, несложно.

PS: слегка обидно, что месяц горбатился, выписывая собственный
обработчик, а, оказывается, все довольно просто... :(

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 01.03.2004 (Пн) 10:35

Где и когда читал не помню, потому как давно писал с использованием IE объектов. На счет navigate и всех других методов и свойств, то на IE объект действуют те же правила, что и на обычный контрол, который ты добавляешь на форму.
Смотри: ты объявляешь IE на уровне формы с возможностью обработки событий

Private WithEvent IE1 AS InternetExplorer

а в коде любой процедуры определяешь новый экземпляр:

Set IE1 = New InternetExplorer 'Все это и есть уже такой же контрол который у тебя на форме лежит и с этого момента ты можешь использовать его методы и свойства
Соответственно ты можешь и IE1.Navigate и все остальное тоже.
Перед выходом или когда больше не нужен очищаешь объектную переменную Set IE1 = Nothing
Ну и в своем коде ты так же можешь использовать IE1.Document.Body.InnerText и все остальные свойства и методы.
Если руки кривые, то не надо ругать разработчиков.


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

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 10

    TopList