2013-01-04 25 views
1

我试图将链接中链接文本的颜色更改为另一个脚本(不受我控制)生成的页面上的黄色。更具体地说,我在本页面的两个表格中搜索特定的文本。一旦我找到文本(它们是超链接),我想将它们的颜色更改为黄色。Perl - 使用HTML更改链接的颜色::元素

我使用HTML :: Element,我可以很容易地找到文本。问题是,没有指定的链接颜色,所以链接使用蓝色的默认值。我试图将字体颜色的HTML元素添加到标记,但我没有太多运气。

如果我尝试使用类似(其中“$ A”是HTML :: Element对象的链接我想编辑):

$a->attr("font color", "yellow"); 

它添加属性,但不改变链接内容的文本颜色。

,如果我尝试类似:

my $content = $a->content; 
$content->attr("font color", "yellow"); 

这不仅增加了文本

<font color=yellow> 

的内容,而无需再次改变实际内容的文字颜色。

试图拼接它也不起作用。

我终于想出了这一点:

my $yellowFont = HTML::Element->new('font', 'color' => 'yellow'); 
foreach my $item_ref ($a->content_refs_list) { 
next if ref $$item_ref; 
$yellowFont->push_content($$item_ref); 
} 
print $yellowFont->as_HTML, "\n"; 

其中在这个意义上精美的作品,它创造:

<font color="yellow">201301022150-Job5</font> 

但是变化不会反映在HTML文档中!

我不知道如何将字体颜色属性插入原始html文档。

下面是我的整个脚本。这是一团糟,因为我一直在尝试各种不同的方法而没有成功。

#!/usr/local/bin/perl 
use warnings; 
use strict; 
use HTML::TableExtract qw(tree); 
use Data::Dumper qw(Dumper); 

my @jobList =(); 
if ($ARGV[0]) {@jobList = $ARGV[0];} else {die ("Need list of jobs as argument\n")}; 

my $ddHTMLFile = "./tmp_aptg"; 
my $te1 = HTML::TableExtract->new(depth => 1, count => 0); 
my $te2 = HTML::TableExtract->new(depth => 1, count => 1); 

$te1->parse_file($ddHTMLFile); 
$te2->parse_file($ddHTMLFile); 

my $table1 = $te1->first_table_found; 
my $table2 = $te2->first_table_found; 

my $table1_tree = $table1->tree; 
my $table2_tree = $table2->tree; 

foreach my $a ($table1_tree->find_by_tag_name("a")) { 
    my $href = $a->attr("href"); 
    if ($href =~ m/$jobList[0]/) { 
    my $yellowFont = HTML::Element->new('font', 'color' => 'yellow'); 
    foreach my $item_ref ($a->content_refs_list) { 
     next if ref $$item_ref; 
     $yellowFont->push_content($$item_ref); 
     } 
    #print $yellowFont->as_HTML, "\n"; 
    $a->replacewith 
    $a->dump; 

    #my $table1_html = $table1_tree->as_HTML; 
    #my $document1_tree = $te1->tree; 
    #my $document1_html = $document1_tree->as_HTML; 
    #my $document_html = $document1_html; 
    #print "$document_html"; 
    } 
} 

回答

3

每次有人使用<font>标签,我们不得不牺牲cute kittenshecatomb到所承诺语义标记愤怒webdevs。字体本身没有语义。相反,通过CSS可以很容易地完成这些事情,它们在改变元素的颜色方面非常擅长。

要设置一个元素黄色的颜色,我们有下面的代码添加到style属性:

color: yellow !important; 

喜欢的东西

$a->attr(style => "color: yellow !important;"); 

很可能会做的伎俩,虽然那会覆盖任何以前的内容。我们可以尝试将颜色附加到之前的内容,但我们无法保证已经存在的CSS有效。

如果目标浏览器了解CSS3(*叹*),我们可以使用一些不错的选择做这项工作对我们来说,像

<style> 
    table a[href~="$foo"] { color: yellow !important } 
</style> 

其中$foo拥有一个健全的字符串字面匹配(无正则表达式)。

这里有一个数据,网址,您可以复制&粘贴到地址栏即可看到这个(希望)工作:

data:text/html,<style>table a[href~="foo"] { color: yellow !important }</style><table><tr><td><a href="bar">bar</a></td><td><a href="foo">foo</a></tr></table> 

另一种解决方案是创建一个新的<span>元素携带的CSS,并且是该链接的唯一孩子。然后<a>的前孩子将成为<span>的孩子。

# not tested, but looks reasonable 
my $span = HTML::Element->new("span", style => "..."); 
my @childs = $a->detach_content; 
$span->push_content(@childs); 
$a->push_content($span); 

这是从以前的解决方案略有不同,但这种差异不应该的问题,除非一些先进的CSS技巧是在页面布局中使用。

如果你真的到,你可以使用这个解决方案来使用字体标签。
“pleease do not!can we haz <span>?” ←小猫。

要了解您可以对HTML元素对象执行哪些操作,请参见HTML::Element documentation

+0

感谢您的答案,但我不能使用CSS。该网页是由一个自动化脚本创建的,该脚本只是抽出HTML而没有链接到它的任何CSS,我不能添加任何CSS(公司规则)。我唯一的解决方案是编辑脚本输出的HTML。 –

+0

@phileasfogg正如我所说,''的解决方案可以很容易地适应使用字体标签,所以不需要CSS。基本上'HTML :: Element-> new(“font”,color =>“yellow”)''。请注意'''标签出现在HTML 3.2中,在HTML 4.0 Transitional中不推荐使用,并且在HTML 4.0 Strict及更高版本中* * invalid *,因此请务必首先检查文档类型。 – amon

+0

啊,对不起,没有读到您刚刚发表的评论,对此抱歉。再次感谢您的帮助。 –