免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 7942 | 回复: 30
打印 上一主题 下一主题

问个关于Html标签整理的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-03 13:19 |只看该作者 |倒序浏览
10可用积分
目前有一些Html需要对其Source的内容进行整理。

Html的内容如下所示

<html>

<head>
<title>XXXXXXX</title>
</head>

<body>

<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:0in><span face=Arial><span class=GramE><span
class=grame><span style='font-size:10.0pt;font-family:Arial'>AAAAA<b><span face=Arial>BBBBB</span></b>
<span face=Arial>CCCCC</span><b><span face=Arial>DDDDD</span></b><span face=Arial>EEEEE</span><span
face=Arial><span style="mso-spacerun:yes">FFFFF</span></span><span face=Arial>GGGGG</span>
<span face=Arial>HHHHH</span><o:p></o:p></span></span></span></span></p>

</body>

</html>

现在想要在Source中的将无用的Span信息进行删除。

如<span lang=XXXX>AAAAA</span>      ---->   AAAAA
    <span class=XXXX>BBBBB</span>   ---->  BBBBB
    <span face=XXXX>CCCCC</span>    ---->  CCCCC
这样的可变Tag如何能除掉?

因为Tag涉及到作用域问题,不能简单地用匹配模式进行整理。
Html::TreeBuilder这个模块看了下,还是没弄清楚如何处理好可变Tag。

最佳答案

查看完整内容

试试下面代码

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
2 [报告]
发表于 2009-02-03 13:19 |只看该作者
试试下面代码
  1. {
  2.     my $mainspan;
  3.     my $h = HTML::TreeBuilder->new_from_content( decode($encode, $s) );

  4.     for my $p ($h->look_down(_tag => q{p}) ) {

  5.         for my $span( $h->look_down(_tag => q{span}) ) {
  6.             if ( defined $span->attr('lang') ) {
  7.                 $span->attr(lang=>undef);
  8.                 $mainspan = $span;
  9.                 last;
  10.             }
  11.         }

  12.         for my $span( $p->look_down(_tag => q{span}) ) {
  13.             $span->replace_with_content($span->content_refs_list);
  14.         }

  15.         my @content = $p->content_list;

  16.         if (@content) {
  17.             $p->detach_content();
  18.             $mainspan->push_content(@content);

  19.             $p->push_content($mainspan);
  20.         }
  21.     }

  22.     $s = encode( $encode, $h->as_HTML('<>&',' ',{}) ) . "\n";
  23.     $s =~ s/span_space/&nbsp;/g;

  24.     print $s;

  25.     $h->delete;

  26. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2009-02-03 14:12 |只看该作者

回复 #1 niaya 的帖子

因为Tag涉及到作用域问题,不能简单地用匹配模式进行整理。


没看懂,只是要去掉span的话
s{<span.*?>(.*?)</span>}{\1}g
大致这个意思,不行吗?

用HTML::TreeBuilder抽取信息的话可以这样做,无视attribute就是了

my $tree = new HTML::TreeBuilder;
$tree->parse($file);
my @span = $tree->look_down('_tag', 'span');
foreach my $span (@span) {
&nbsp;&nbsp;print $span->as_text;
}


不过看上去你想要的是inline操作对吧,那样的话,HTML::Parser或者HTML::TokeParser::Simple可能更合适一些。

论坛徽章:
0
4 [报告]
发表于 2009-02-03 16:49 |只看该作者
原帖由 islue 于 2009-2-3 14:12 发表


没看懂,只是要去掉span的话
s{(.*?)}{\1}g
大致这个意思,不行吗?

用HTML::TreeBuilder抽取信息的话可以这样做,无视attribute就是了

my $tree = new HTML::TreeBuilder;
$tree->parse($file);
...



不好意思,可能有些没解释清楚。

我不是想删除所有的span标签,只是想删除上面提到的几个<span lang=XXX><span class=XXX><span face=XXXX>.当一个标签中出现这样的结构时<span lang=EN-US style='font-size:9.0pt;line-;font-family:"宋体 "'> 只去掉lang=EN-US即可。(结果变成<span style='font-size:9.0pt;line-;font-family:"宋体 "'>

另外我说的作用域是这样的
<span color=green><span lang=EN-US color=blue>Perl<span lang=ZH-CN color=red>是可移植的。</span>Perl</span></span>
蓝色是一个作用域,而红色是另一个作用域
如果只是删除距离最近的<span lang=EN-US color=blue</span>的话。代码就会变成
<span color=green>Perl<span lang=ZH-CN color=red>是可移植的。Perl</span></span>
要找到成对匹配的<span>和</span>。

看一下下面的例子吧(借用下大骆驼书的前言作为Html的Body部分)

  1. <body lang=ZH-CN link=blue vlink=purple style='tab-interval:21.0pt;text-justify-trim:
  2. punctuation'>

  3. <p style='margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:.0pt; '><span face=宋体><span class=GramE><span class=grame><span lang=EN-US style='font-size:9.0pt; font-family:宋体'><b> Perl </b><span face=宋体>是不同的语言。</span></b><span face=宋体>从一开始, </span><b><span face=宋体> Perl</span></b><span face=宋体>就设计成可以把简单工作简单化,</span><span
  4. face=宋体><span style="mso-spacerun:yes">同时又不失</span></span><span face=宋体>去处理困难问题</span>
  5. <span face=宋体>能力的语言。</span><o:p></o:p></span></span></span></span></p>

  6. </body>
复制代码


整理完成后变为
  1. <body lang=ZH-CN link=blue vlink=purple style='tab-interval:21.0pt;text-justify-trim:
  2. punctuation'>

  3. <p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.2in;
  4. margin-bottom:.0001pt'><span style='font-size:9.0pt;font-family:宋体'> <b> Perl </b>是不同的语言。从一开始,<b> Perl </b>就设计成可以把简单工作简单化,同时又不失去处理困难问题能力的语言。<o:p></o:p></span></p>

  5. </body>
复制代码

[ 本帖最后由 niaya 于 2009-2-3 17:04 编辑 ]

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
5 [报告]
发表于 2009-02-04 02:04 |只看该作者

回复 #3 niaya 的帖子

不太会用
删除属性$span->attr('lang', undef);

论坛徽章:
0
6 [报告]
发表于 2009-02-04 12:57 |只看该作者
use strict;
use warnings;
use Encode;
use HTML::TreeBuilder;


my $html = q^
<span lang=EN-US style='font-size:9.0pt; font-family:宋体' class='xxxx'></span>
<span face=宋体>是不同的语言。</span>
^;
### Decode HTML if it's non en_US
$html = decode('GBK', $html);

### Build HTML tree
my $tree = HTML::TreeBuilder->new_from_content($html);
print $tree->as_HTML, "\n";

### Strip attributes specified
my @stripAttrs = qw/class face lang/;
my @spanTags = $tree->look_down('_tag' => 'span');
for my $tag (@spanTags) {
&nbsp;&nbsp;&nbsp;&nbsp;for my $attr (@stripAttrs) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tag->attr($attr, undef) if $tag->attr($attr);
&nbsp;&nbsp;&nbsp;&nbsp;}
}
print $tree->as_HTML, "\n";

### MUST delete the tree explicitly
$tree = $tree->delete;

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
7 [报告]
发表于 2009-02-04 15:00 |只看该作者
  1. #!/usr/bin/perl -w

  2. use warnings;
  3. use strict;

  4. use Encode;
  5. use HTML::Entities;
  6. use HTML::TreeBuilder;

  7. my $encode = 'gbk';# change it according to your env

  8. my $html = <<'__HTML__';
  9. <body lang=ZH-CN link=blue vlink=purple style='tab-interval:21.0pt;text-justify-trim:
  10. punctuation'>

  11. <p style='margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:.0pt; '><span face=宋体><span class=GramE><span class=grame><span lang=EN-US style='font-size:9.0pt; font-family:宋体'><b> Perl </b><span face=宋体>是不同的语言。</span></b><span face=宋体>从一开始, </span><b><span face=宋体> Perl</span></b><span face=宋体>就设计成可以把简单工作简单化,</span><span
  12. face=宋体><span style="mso-spacerun:yes">同时又不失</span></span><span face=宋体>去处理困难问题</span>
  13. <span face=宋体>能力的语言。</span><o:p></o:p></span></span></span></span></p>

  14. </body>
  15. __HTML__

  16. {
  17.     my $h = HTML::TreeBuilder->new_from_content( decode($encode, $html) );

  18.     my $p = $h->look_down(_tag => q{p});

  19.     my $mainspan;
  20.     for my $span( $h->look_down(_tag => q{span}) ){
  21.         if ( defined $span->attr('lang') ) {
  22.             $span->attr(lang=>undef);
  23.             $mainspan = $span;
  24.             last;
  25.          }
  26.     }
  27. #print decode_entities($mainspan->as_HTML), "\n";

  28.     for my $span( $h->look_down(_tag => q{span}) ){
  29.         $span->replace_with_content($span->content_refs_list);
  30.     }

  31.     my @content = $p->content_list;
  32.     $p->detach_content();

  33.     $mainspan->push_content(@content);
  34.     $p->push_content($mainspan);

  35.     print encode( $encode, $h->as_HTML('<>&',' ',{}) ), "\n";

  36.     $h->delete;
  37. }
  38. __END__
  39. <html>
  40. <head>
  41.   </head>
  42.    <body lang="ZH-CN" link="blue" style="tab-interval:21.0pt;text-justify-trim:
  43.    punctuation" vlink="purple">
  44.      <p style="margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:.0pt; "><span style="font-size:9.0pt; font-family:宋体"><b> Perl </b>是不同的语言。从一开始, <b> Perl</b>就设计成可以把简单工作简单化,同时又不失去处理困难问题 能力的语言。</span></p>
  45.    </body>
  46. </html>
复制代码

论坛徽章:
0
8 [报告]
发表于 2009-02-05 14:40 |只看该作者
首先感谢楼上朋友们的回答。非常感谢。

现在参考的是6楼的代码。

在编译到($mainspan->push_content(@content);)时,提示以下警告信息:

Can't call method push_content on an undefined value.

是指@content为Undef了吗?这个问题怎么解决?

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
9 [报告]
发表于 2009-02-05 14:48 |只看该作者
原帖由 niaya 于 2009-2-5 14:40 发表
首先感谢楼上朋友们的回答。非常感谢。

现在参考的是6楼的代码。

在编译到($mainspan->push_content(@content);)时,提示以下警告信息:

Can't call method push_content on an undefined value.

...

$mainspan为undefined了。就是<span lang=EN-US ...>没找对

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
10 [报告]
发表于 2009-02-05 14:51 |只看该作者

回复 #7 niaya 的帖子

那段代码写的不够健壮。用的时候完善一下吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP