新人报到,顺便问个关于清理html部分标签的方法

新人报到,顺便问个关于清理html部分标签的方法

目前有一个html文件,因为使用了Word编辑了其格式,导致其html中加入了大量无用代码。

html结构如下

<head>
<meta XXXXXXXX>
<meta XXXXXXXX>
.
.
.
<office XXXXXXXX>
<office XXXXXXXX>
.
.
.
<title>A sample Page</title>
.
.
.
<mso: XXXXXX>
<mso: XXXXXX>
<mso: XXXXXX>
.
.
.
</head>


目前想要把上面的Source变成<head>部中仅有<title>标签。
(上面的html的head部分转换完毕为<head><title>A sample Page</title></head>这样)

目前思路是从<head>到<title>中间的部分删除,然后删除从</title>到</head>部分的内容。

代码如下:

前略

sub head() {

my $file = $_[0];
my $line = "";

open(IN , "<$file" || die "Can't open this file."
while (chomp($line = <IN>) {
$line = ~s /[\r\n]/ g;                             #在这里删除了所有的空行,整个html的内容被读取成一行。
$line = ~s /<head>(.*)<title>/ <head><title> / /g;
$line = ~s /<\/title>(.*)<\/head>/ <\/title><\/head> / /g;
}

执行结果却发现,根本没有执行替换操作。  
如果写成$line = ~s /<title>(.*)<\/title>/<title><\/title>/ g;则可以实现title名清空。
请各位帮忙看看是什么问题。
你好
1. 你只读了文件却 但并没有输出
2. '=~' 中间不应该有空格
3. '$line = ~s /[\r\n]/ g;      ' 这句话是错了
按照我的理解帮你去掉语法错误 $line =~ s/[\r\n]//g; 这句话并不能帮你把整个html读成一行 所以你下面的替换也不起作用。


QUOTE:
原帖由 DQP 于 2009-1-2 16:34 发表
你好
1. 你只读了文件却 但并没有输出
2. '=~' 中间不应该有空格
3. '$line = ~s /[\r\n]/ g;      ' 这句话是错了
按照我的理解帮你去掉语法错误 $line =~ s/[\r\n]//g; 这句话并不能帮你把整个html读成一 ...

谢谢2楼的指正

但是如果说删除掉了空行还有chomp的读入都不能使html读成一行的话,怎么样才可以将html读成一行呢。
如果不读成一行,对TAG的处理好像要麻烦很多。
Html里面的标签都是一对一对出现的。我现在想删除其中的某些对。比如如下的html的Body部

<Span lang=XXXX><Span face=XXXXXXXX><Span Stytle=XXXXXXX>ABCDEFG</Span>HIJKLMN</Span>OPQ</Span>

假如说我想删除掉中间那层的TAG,也就是<Span face=XXXXX>和</SPAN>的话,用什么办法实现好呢?
(删除后结果是<Span lang=XXXX><Span Stytle=XXXXXXX>ABCDEFG</Span>HIJKLMNOPQ</Span>)

现在我的想法是用栈来实现,但是不大清楚Perl的栈机制是什么样子的。请各位帮忙看下,不胜感谢。
use HTML::TreeBuilder;


QUOTE:
原帖由 niaya 于 2009-1-2 21:56 发表



谢谢2楼的指正

但是如果说删除掉了空行还有chomp的读入都不能使html读成一行的话,怎么样才可以将html读成一行呢。
如果不读成一行,对TAG的处理好像要麻烦很多。

$_ = join '', <IN>;


QUOTE:
原帖由 cobrawgl 于 2009-1-3 12:26 发表


$_ = join '', ;

太感谢了。果然好用。这个功能已经实现了。

但是还有一个问题要问,现在是按一行读入进行处理的,能不能在写回文件的时候,再次进行分行处理呢?

现在的代码都在一行之中,维护起来很麻烦。
自己再顶一次~


QUOTE:
原帖由 niaya 于 2009-1-3 14:19 发表



太感谢了。果然好用。这个功能已经实现了。

但是还有一个问题要问,现在是按一行读入进行处理的,能不能在写回文件的时候,再次进行分行处理呢?

现在的代码都在一行之中,维护起来很麻烦。

合并完了,没有特殊标记不好分行。
#!/usr/bin/perl
  2 open IN, "<perltest";
  3 chomp(@content = <IN>);
  4 open OUT, ">perltest";
  5 select OUT;
  6 foreach $line (@content)
  7 {
  8         unless($line =~ /head|title/)
  9         {
10                 $line =~ s/$line//g;
11         }
12         print $line;
13 }
14