2011-08-15 68 views
3

我使用Perl模块HTML::PullParser。我注意到它有时会随机分割一个文本元素(据我所知)。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代码 - 当它们都存在时,会发生此错误。但是当任何一个人都没有对方时,这个问题就会消失......我非常困惑和烦恼。

回答

3

HTML :: PullParser是HTML :: Parser的子类。 HTML :: Parser有一个unbroken_text属性,用于控制是否尽快吐出文本事件,或者是否缓存文本直到解析器知道没有更多文本即将到达。默认是尽快生成文本节点。一个$p->unbroken_text(1)调用应该使它缓冲:)

+0

'HTML :: PullParser'是'HTML :: Parser'的一个子类,你的意思是。 –

+0

@恶魔otto权利;) – hobbs

+0

工程像魔术。非常感谢! – Zhang18