在现代网络技术中,数据格式的转换是一个常见需求。例如,将网页从HTML格式转换为GRML格式。本文将介绍如何使用服务器端脚本语言,如ASP和Perl,来实现这种转换。将通过两个具体的例子来说明这个过程:第一个是如何提取HTML页面中的超链接并将其转换为GRML格式,第二个是如何转换图片。这些操作需要服务器端的处理能力。
在开始之前,建议读者对ASP和Perl有一定的了解。Perl是一种强大的脚本语言,它支持正则表达式,这在提取网页中的超链接和图片时非常有用。虽然任何服务器端脚本环境都可以执行这类任务,包括.NET、CGI或PHP,但本文将使用Perl和ASP。特别是,将使用PerlScript作为服务器端脚本语言。要使用PerlScript,需要下载一个Perl解释器。如果使用的是IIS,可以尝试下载ActivePerl。
在深入讨论之前,建议先阅读《介绍GRML》和《使用GRML》这两篇文章,它们提供了关于GRML是什么以及如何使用它的详细解释。
适配器通常被定义为...一个将组件的原始接口转换为另一个接口的对象。
在本文的上下文中,适配器的定义是...服务器端处理或脚本,它将一种标记语言转换为另一种。
这个定义描述了使用ASP将HTML转换为GRML的过程。适配器对象是ASP脚本,原始接口是HTML,另一个接口是GRML。
HTML并不描述其内容的许多元素。例如,没有办法确定一个文本块的属性与另一个文本块的属性。然而,并非所有HTML内容都没有描述。它确实有特定的标签用于超链接和图片。
使用特定标签来识别内容使得创建一个只读取这些标签的脚本成为可能。当找到这些标签时,不需要的标签元素被移除,只留下内容。然后,脚本将内容以新格式或标记语言写入。这就是如何将HTML超链接或图片适配到GRML的过程。
使用
下面是一个使用PerlScript的HTML到GRML超链接适配器的示例:
<%@ Language="PerlScript" %>
<HTML>
<center>
<form action="links.asp">
URL to extract:
<input type="text" name="url1" length="60">
<input type="submit">
</form>
</center>
<!--
<grml>
<edit url1>
<title>Enter URL:>
</edit>
<%
use HTML::LinkExtor;
use URI::URL;
use LWP;
my $url, $html;
#
Parsing the Request
$url = $Request->QueryString("url1")->Item();
$Response->Write("\n");
$Response->Write("GRMLBrowser.com/links.asp\n");
$Response->Write(" \n");
$Response->Write("\n");
$Response->Write("$url\n");
$Response->Write(" \n");
if ($url eq "") {
$Response->Write("\n");
} else {
if ($url !~ /http:\/\//) {
$url = "http://" . $url;
}
}
#
Constructing the Request
$_ = $sites;
#
Retrieving the Response/Resultset
#
- Filtering the Resultset (optional)
my $ua = LWP::UserAgent->new(agent => "Mozilla 4.0");
my $request = HTTP::Request->new('GET', $url);
my $response = $ua->request($request);
unless ($response->is_success) {
print $response->error_as_HTML . "\n";
exit(1);
}
my $res = $response->content();
#
content without HTTP header
$Response->Write("\n");
$Response->Write("\n");
$Response->Write("\n");
$Response->Write("\n");
$Response->Write(" \n");
$Response->Write("\n");
$res =~ s/\n/ /gsi;
while ($res =~ m|href=(.+?)>(.*?)|gsi) {
my $temp_link = $1;
my $temp_item = $2;
$temp_link =~ s/\'//gsi;
$temp_link =~ s/\"//gsi;
$temp_link =~ s/(.*)//gsi;
$temp_link =~ s///gsi;
$temp_link =~ s/<\/b>//gsi;
$temp_link =~ s/&/\&/gsi;
$temp_link =~ s/\n(.*)//gsi;
$temp_item =~ s///gsi;
$temp_item =~ s/<\/b>//gsi;
$temp_item =~ s/<(.+?)>//gsi;
$temp_item =~ s/<\/font>//gsi;
$temp_item =~ s/&/\&/gsi;
$temp_item =~ s/ //gsi;
$temp_item =~ s/"/\"/gsi;
$temp_item =~ s/\n(.*)//gsi;
$temp_item =~ s/\n/ /gsi;
$temp_item =~ s/(.*)//gsi;
$temp_item =~ s/(.*)//gsi;
if ($temp_item !~ /img src=/) {
if ($temp_link !~ /$url/ && $temp_link !~ /\/\//) {
$temp_link = $url . "/" . $temp_link;
}
$temp_item =~ s/\n//gsi;
$temp_link =~ s/\n//gsi;
$Response->Write("$temp_link\n");
$Response->Write("$temp_item\n");
}
$Response->Write("$url\n");
$Response->Write("\n\n");
}
$Response->Write(" \n");
$Response->Write("\n");
%>
-->
</html>
上面的代码创建了一个HTML表单,用于提取网页中的所有超链接。这些超链接(及其标题)使用GRML格式化。要查看GRML,需要一个GRML网页浏览器(例如Pioneer Report MDI)。
使用标签,脚本能够找到并提取HTML中的图片。通过读取这个标签并移除不需要的标签元素,HTML图片被转换为GRML。以下脚本演示了这一点:
<%@ Language="PerlScript" %>
<center>
<form action="translate.asp">
URL to translate:
<input type="text" name="url1" length="60">
<input type="submit">
</form>
</center>
<!--
<grml>
<edit url1>
<title>Enter URL:</edit>
<%
use HTML::LinkExtor;
use URI::URL;
use LWP;
my $url, $html;
#
Parsing the Request
$url = $Request->QueryString("url1")->Item();
if ($url eq "") {
$Response->Write("\n");
} else {
if ($url !~ /http:\/\//) {
$url = "http://" . $url;
}
}
$Response->Write("### URL ###\n\n");
$Response->Write("The url is: $url\n\n");
#
Constructing the Request
$_ = $sites;
#
Retrieving the Response/Results
#
- Filtering the Results (optional)
my $ua = LWP::UserAgent->new(agent => "my agent V1.00");
my $request = HTTP::Request->new('GET', $url);
my $response = $ua->request($request);
unless ($response->is_success) {
print $response->error_as_HTML . "\n";
exit(1);
}
my $res = $response->content();
#
content without HTTP header
my @imgs = ();
my @hrefs = ();
#
Make the parser. Unfortunately, we don't know the base yet
#
(it might be different from $url)
my $p = HTML::LinkExtor->new(\&callback);
$p->parse($res);
#
Expand all image URLs to absolute ones
my $base = $response->base;
@imgs = map { $_ = url($_, $base)->abs; } @imgs;
$Response->Write("\n");
$Response->Write("\n");
$Response->Write("\n");
$Response->Write(" \n\n");
$Response->Write("\n");
foreach (@imgs) {
$Response->Write("$_\n");
}
$Response->Write("\nLinks:\n");
foreach (@hrefs) {
my $temp = $_;
if ($temp !~ /$url/ && $temp !~ /\/\//) {
$temp = $url . "/" . $temp;
}
$Response->Write("$temp\n");
}
sub callback {
my($tag, %attr) = @_;
push(@imgs, values %attr) if $tag eq 'img';
push(@hrefs, values %attr) if $tag eq 'a';
}
%>
</result>
</GRML>
-->
上面的脚本用作HTML读取器,除了用于构建列和每个结果的行。这些行是GRML写入器:
使用适配器可以将HTML转换为GRML。只有具有可识别标签的内容才能从一种标记语言转换为另一种。在HTML的情况下,有用于识别超链接和图片的标签。