HTML :: PullParser разбивает текстовый элемент случайным образом - PullRequest
3 голосов
/ 15 августа 2011

Я использую модуль 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

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

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

1 Ответ

3 голосов
/ 16 августа 2011

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

...