Perl - 使用HTML :: Element更改链接的颜色

时间:2013-01-04 22:21:27

标签: html perl

我正在尝试将链接中链接文本的颜色更改为另一个脚本(不受我控制)生成的页面上的黄色。更具体地说,我正在本页的两个表中搜索特定文本。一旦我找到文本(这是超链接),我想将其颜色更改为黄色。

我正在使用HTML :: Element,我可以轻松找到文本。问题是,没有指定的链接颜色,因此链接使用默认值blue。我正在尝试将标记颜色的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";
  }
}

1 个答案:

答案 0 :(得分:3)

每次有人使用<font>标记时,我们都必须牺牲hecatomb cute kittens CSS来承诺语义标记的愤怒的webdev。字体本身没有语义。相反,这些事情可以很容易地通过HTML::Element documentation来完成,这在改变元素的颜色时非常擅长。

要将一个元素的颜色设置为黄色,我们必须将以下代码添加到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>

另一个解决方案是创建一个带有CSS的新<span>元素,并且是该链接的唯一子元素。 <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技巧,否则这种差异并不重要。

如果您确实 ,则可以使用此解决方案来使用字体标记 &#34;请不要这样做!我们可以<span>吗?&#34; ←小猫。

要了解您可以对HTML元素对象执行的操作,请参阅{{3}}。