Perl 使用HTML::TokParser::Simple进行HTML解析
我正在用Perl 使用HTML::TokParser::Simple进行HTML解析,perl,html-parsing,Perl,Html Parsing,我正在用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
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文档内容:
<html>
<span>Test HTML</span>
<script type="text/javascript">
<!--
var form_submitted = 0;
function submit_form() {
[..]
}
//-->
</script>
</html>
测试HTML
如何从显示中忽略
JavaScript
标记内容。我得到了所需的结果。评论(正确地)不被我的版本视为文本。看起来您需要升级正在使用的模块。(我使用了HTML::Parser 3.69和HTML::Parser::Simple 3.15。)
您仍然需要处理HTML实体并有效地格式化文本,后者非常困难,因为您删除了所有格式化指令。你的方法似乎有致命的缺陷。我得到了想要的结果。评论(正确地)不被我的版本视为文本。看起来您需要升级正在使用的模块。(我使用了HTML::Parser 3.69和HTML::Parser::Simple 3.15。)
您仍然需要处理HTML实体并有效地格式化文本,后者非常困难,因为您删除了所有格式化指令。你的方法似乎有致命的缺陷。我相信你只需要使用
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模块()中改编了它,该模块有很多方便的方法可以帮助您。它基本上充当对象中的web浏览器。我相信您只需要使用
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模块()中改编了它,该模块有很多方便的方法可以帮助您。它基本上充当对象中的web浏览器。扫描令牌以忽略所有打开和关闭脚本标记。请参见下文中用于解决问题的部分
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";
}
}
扫描令牌以忽略所有打开和关闭脚本标记。请参见下文中用于解决问题的部分
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";
}
}