我正在使用HTML::TokeParser::Simple
解析HTML文件。 HTML文件的内容如下所示。我的问题是,我试图忽略JavaScript显示为文本内容。例如:
use HTML::TokeParser::Simple;
my $p = HTML::TokeParser::Simple->new( 'test.html' );
while ( my $token = $p->get_token ) {
next unless $token->is_text;
print $token->as_is, "\n";
}
这将打印输出,如下所示:
Test HTML
<!--
var form_submitted = 0;
function submit_form() {
[..]
}
//-->
实际的HTML文档内容:
<html>
<span>Test HTML</span>
<script type="text/javascript">
<!--
var form_submitted = 0;
function submit_form() {
[..]
}
//-->
</script>
</html>
如何忽略显示的JavaScript
标记内容。
答案 0 :(得分:1)
我得到了理想的结果。评论(正确地)不被我的版本视为文本。看起来您需要升级您正在使用的模块。 (我使用HTML :: Parser 3.69和HTML :: TokeParser :: Simple 3.15。)
>perl a.pl
Test HTML
>
您仍然需要处理HTML实体并有用地格式化文本,后者非常困难,因为您删除了所有格式化指令。你的方法似乎有致命缺陷。
答案 1 :(得分:0)
我相信您只需要使用as_text
方法。
my $tree = HTML::TreeBuilder->new();
$tree->parse( $html );
$tree->eof();
$tree->elementify(); # just for safety
my $text = $tree->as_text();
$tree->delete;
我从WWW :: Mechanize模块(http://search.cpan.org/dist/WWW-Mechanize/)改编了这个模块,它有许多方便的方法可以帮到你。它基本上充当对象中的Web浏览器。
答案 2 :(得分:0)
扫描令牌以忽略所有打开和关闭的脚本标记。请参阅下面用于解决问题。
my $ignore=0;
while ( my $token = $p->get_token ) {
if ( $token->is_start_tag('script') ) {
print $token->as_is, "\n";
$ignore = 1;
next;
}
if ( $token->is_end_tag('script') ) {
$ignore = 0;
print $token->as_is, "\n";
next;
}
if ($ignore) {
#Everything inside the script tag. Here you can ignore or print as is
print $token->as_is, "\n";
}
else
{
#Everything excluding scripts falls here handle as appropriate
next unless $token->is_text;
print $token->as_is, "\n";
}
}