HTML::PullParser случайным образом разбивает текстовый элемент

Я использую модуль Perl HTML::PullParser. Я заметил, что иногда он разбивает текстовый элемент (насколько я могу судить) случайным образом.

Например, если у меня есть html-файл test.html с содержимым

<html>
...
<FONT STYLE="font-family:Times New Roman" SIZE="2">THE QUICK BROWN FOX</FONT>
...
</html>

И мой код perl выглядит примерно так

my $html = HTML::PullParser->new(file => 'test.html', text => '"T", text');
while (my $token = $html->get_token) {
    print "$$token[1]\n";
}

Потом иногда я возвращаюсь

THE QUICK BROWN FOX    # correctly parsed

Но в других случаях я получаю

THE QUICK
 BROWN FOX

где текстовый элемент анализируется на два отдельных токена. Однако в других случаях, в зависимости от другого содержимого html-файла, я получаю

THE QUICK BROWN
 FOX

где точка разрыва другая. Такое поведение крайне раздражает. И я изо всех сил старался изолировать проблему. Похоже, это зависит от всего файла (т.е. если я удалю остальную часть файла, чтобы остался только этот элемент, тогда все в порядке). Однако я не могу определить, какая часть остальной части файла вызвала это. Интересно, есть ли у кого-нибудь подобный опыт и кто знает, как обойти эту проблему? Спасибо!!

ОБНОВЛЕНИЕ: появление этого ошибочного поведения также НЕ зависит от одного раздела html-кода в другом месте файла. Мне удалось изолировать два раздела html-кодов перед этим текстовым элементом — когда они оба присутствуют, возникает эта ошибка. Но когда одно присутствует без другого, эта проблема исчезает... Я совершенно сбит с толку и раздражен.


person Zhang18    schedule 15.08.2011    source источник


Ответы (1)


HTML::PullParser является подклассом HTML::Parser. HTML::Parser имеет атрибут unbroken_text, который управляет выводом текста. событий как можно скорее, или буферизует текст до тех пор, пока синтаксический анализатор не узнает, что текст больше не поступает. По умолчанию текстовые узлы создаются как можно быстрее. вызов $p->unbroken_text(1) должен сделать его буфером :)

person hobbs    schedule 15.08.2011
comment
Вы имеете в виду, что HTML::PullParser является подклассом HTML::Parser. - person evil otto; 16.08.2011
comment
@hobbs, у вас есть похожее решение той же проблемы с XML::Parser? Спасибо. - person Zhang18; 26.08.2011
comment
@ Zhang18 нет, может и есть, но я не знаю. - person hobbs; 26.08.2011