![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Парсинг HTML [D7, WinXP]
Alex_C © (2009-05-21 19:06:00)Столкнулся с весьма специфичной задачью:
есть в инете HTML страничка. Надо ее скачать и пропарсить. Парситься она очень просто - каждый столбец у нее имеет свою позицию и длинну.
Проблема выяснилась в том, что данные в эту табличку могут вноситься с использованием национальных символов. В частности венгерская буква "o с двуми черточками сверху" при приеме интерпритируется в 2 символа - Е' - в результате чего столбцы сдвигаются, и парсить становиться невозможно. Кто нибудь знает, как с этим бороться?
brother (2009-05-25 04:11:00) [1]не хочу буквоедничать, но как согласуется
> Нет там тегов. Текст просто разбитый ПРОБЕЛАМИ по столбцам.
с
> В заголовке стоит content="text/html;charset=utf-8".
> куда между тегами <br> вставлен обычный кусок текста.
что фигней страдаешь? Штирлиц?
показывай код твоего HTML.
KilkennyCat (2009-05-24 23:03:00) [2]
> sniknik © (24.05.09 22:24) [27]
Именно об этом я и говорил, что парсить надо сразу. А когда уже преобразовано хрен знает где и чем - можно только гадать.
sniknik (2009-05-24 22:24:00) [3]> [0] Надо ее скачать и пропарсить.
где в словах скачать и пропарсить есть слова "копируется через буфер обмена"?
(эффект неявного преобразования при копировании через буфер это именно то про, что говорил Игорь Шевченко)
понимаю теперь откуда взялся html который "не html" и таблица без табличных тегов... автор оказывается исходный код html странички получает копируя отображаемое браузером через буфер обмена.
KilkennyCat (2009-05-24 22:04:00) [4]В общем, как обычно - задающий нифига не может объяснить толком, что у него за проблема, обзывает всех тупыми, и у одного оказался телепатор.
Alex_C (2009-05-24 20:08:00) [5]
> Игорь Шевченко © (24.05.09 00:40) [20]
> sniknik © (24.05.09 00:20) [19]
>
>
> > а тебе бы научится получше читать...
>
>
> взаимно.
>
> Я имел в виду, что буква ő может вставиться в неюникодную
> программу как o", а буква ű - как u". По меньшей мере я
> наблюдал такой эффект через буфер обмена.
В общем как обычно - куча тупых советов, но все же один человек нашелся, который все объяснил!
То Игорь Шевченко: Вот! Совершенно верно! Никакой utf-8 тут не причем. Совершенно верно - "что буква ő может вставиться в неюникодную программу как o", а буква ű - как u". "
KilkennyCat (2009-05-24 13:36:00) [6]Я знаю, что такое utf-8.
sniknik (2009-05-24 12:19:00) [7]> а я имел ввиду, что пофиг как кто что чем где и когда отображает.
вот именно это и показывает, что ты не понимаешь то, что тут описывают как проблему.
> Тянем файл. Такой, какой он есть на сервере. Обращаемся к нему как к набору байт.
и видим, что "таблица" ровно отображающаяся в браузере "кривая" в строках таких каких она есть на сервере.
> И пофиг, юникод или нет. 1 байт или 2.
сколько раз повторить что utf-8 это не юникод? нет там ровно 1-го или 2-х байт на символ. там от 1 до 7 на символ, в произвольном порядке в зависимости от того, что за символ, какого языка.
> Распарсили - вот тогда уже отображаем
как? в этом то у него и вопрос. работать в исходной кодировке он не хочет/не может/не знает как/и т.д., хочет попроще, от того что видит в браузере (и не хочет знать как сам браузер это составил).
алгоритма не зависящего от позиций говорит нет (см. c [3]), а позиционный... то что в браузере начинается с 15 символа например в исходных может начинаться с 20го или 25го, в зависимости от данных в столбце.
> это бред.
еще раз настоятельно рекомендую почитать про кодировки, прежде чем высказываться здесь и обзывать бредом все, что сам не понимаешь.
Германн (2009-05-24 00:55:00) [8]АП на вас троих не хватает!
:)
KilkennyCat (2009-05-24 00:50:00) [9]а я имел ввиду, что пофиг как кто что чем где и когда отображает. Тянем файл. Такой, какой он есть на сервере. Обращаемся к нему как к набору байт. И парсим самостоятельно. И пофиг, юникод или нет. 1 байт или 2. У нас есть жесткие правила, и только ими руководствоваться должно.
Распарсили - вот тогда уже отображаем, как угодно, чем угодно, где угодно и в чем угодно.
А анализировать, как оно все выглядит в каком-то браузере или блокноте или в чем-нить еще, и на основании этого пытаться сообразить парсинг - это бред.
Игорь Шевченко (2009-05-24 00:40:00) [10]sniknik © (24.05.09 00:20) [19]
> а тебе бы научится получше читать...
взаимно.
Я имел в виду, что буква ő может вставиться в неюникодную программу как o", а буква ű - как u". По меньшей мере я наблюдал такой эффект через буфер обмена.
sniknik (2009-05-24 00:20:00) [11]> За ради интереса можешь попробовать поэкспериментировать
зачем мне экспериментировать если я это знаю? а тебе бы научится получше читать...
p.s. Я в ответе за свои слова, а не за то, что вы подумали. (© не помню чей)
> а ты попробуй сразу юникод читать
если сразу читать в юникод то получится бред, utf-8 это ни разу не юникод.
вот преобразовать, и после работать с юникодом, это да, может получится проще.
Игорь Шевченко (2009-05-23 23:28:00) [12]Автор, а ты попробуй сразу юникод читать, в смысле функции с W на конце использовать
Игорь Шевченко (2009-05-23 23:25:00) [13]sniknik © (23.05.09 23:13) [16]
За ради интереса можешь попробовать поэкспериментировать - найди страницу с большим кусом венгерского текста и повставляй его в неюникодные программы с разной кодовой страницей - узнаешь много нового, в частности, про то, что часть венгерских символов преобразуется в пары.
sniknik (2009-05-23 23:13:00) [14]>> вот некоторые национальные символы приходят как 2 байта
> бред какой-то...
тебе тоже не помешает почитать про различные кодировки.
KilkennyCat (2009-05-23 23:09:00) [15]
> Понимаешь, есть "небольшая" проблема - эта страничка Международного
> Союза электросвязи
Ну, да, тогда просить нельзя. А то отругают, или даже побьют.
> Все символы - по 1 байту
> вот некоторые национальные символы приходят как 2 байта
бред какой-то...
может, имеет смысл все-таки сначала пропарсить, а потом отображать? а не пытаться обработать уже обработанное в соответствии каким-то кодировкам...
> вы все меня не поняли!
Тебя прекрасно поняли. Ты сам пойми, где, когда и что делать.
sniknik (2009-05-23 23:08:00) [16]> Ребят, вы все меня не поняли!
все тебя поняли, а вот ты не желаешь понять...
> Т.е. предсказать, когда прийдет такой символ - невозможно.
а не надо предугадывать, надо работать в той кодировке в которой представлен текст, по ее "правилам".
> А самое главное не понимаю, почему IE его отображает нормально, а приходит он как 2 байта.
это потому, что ответов не читаешь... а курс лекций на тему, что же такое utf-8 тебе тут читать не собираются.
Alex_C (2009-05-23 22:59:00) [17]
> тогда это не HTML.
Открою большой секрет - это ХТМЛ ))) Это обычная ХТМЛ страничка, куда между тегами <br> вставлен обычный кусок текста.
> и что, нельзя попросить, чтоб вставили непечатаемый символ?
Понимаешь, есть "небольшая" проблема - эта страничка Международного Союза электросвязи, со штаб-квартирой в Нью-Йорке... Боюсь они меня не послушают )))
> но собствеенно, я все равно не понимаю проблемы. и не понимаю,
> зачем какие-то функции.
> Имеем последовательность байт:
> 12 23 45 67 89 01 56 87
> если это уникод - тут 4 символа. если нет - 8.
Ребят, вы все меня не поняли! НЕТ ТАМ НИКАКИХ 4 байт! Все символы - по 1 байту, и текст - как бы совершенно обычный текст! Но! Вот я смотрю страничку с этим текстом у них на сайте - вижу символ национальный. Скачиваю страничку при помощи InternetReadFile - все скачивается как обычнае символы, по 1 байту, а вот некоторые национальные символы приходят как 2 байта - вот в чем проблема! Т.е. предсказать, когда прийдет такой символ - невозможно. А самое главное не понимаю, почему IE его отображает нормально, а приходит он как 2 байта.
KilkennyCat (2009-05-23 02:51:00) [18]
> а если это UTF8
Возможно. Но без разницы, ибо вряд ди парсируемый документ то в одной, то в другой кодировке. И если утф - бежим по байтам как утф.
> проблемы может и есть но в чем они неясно.
в человеческом факторе, разумеется.
Ну и в Касперском.
sniknik (2009-05-23 01:00:00) [19]> если это уникод - тут 4 символа. если нет - 8.
а если это UTF8 то тут от 2х до 8и символов... смотря что за символы.
> Ну и какие трудности?
а вот это действительно непонятно, т.к. нет конкретики, а "в общем" можно бесконечно одно и тоже мусолить.
т.е. проблемы может и есть но в чем они неясно.
KilkennyCat (2009-05-23 00:29:00) [20]и что, нельзя попросить, чтоб вставили непечатаемый символ?
но собствеенно, я все равно не понимаю проблемы. и не понимаю, зачем какие-то функции.
Имеем последовательность байт:
12 23 45 67 89 01 56 87
если это уникод - тут 4 символа. если нет - 8.
нам надо пропарсить, зная, что следующая колонка с определенной позиции? Ну и какие трудности? Парсим легко и просто. И главное - быстро. А потом уже мучаем с отображением в тексте, конвертируя в нужную кодировку и т.д.