1

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

我正在使用 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";
  }
}
4

1 回答 1

3

每次有人使用该<font>标签时,我们都必须向那些被承诺语义标记的愤怒的webdevs牺牲一大堆可爱的小猫。字体本身没有语义。相反,这些事情可以通过CSS轻松完成,毫无疑问它擅长改变元素的颜色。

要将一个元素的颜色设置为黄色,我们必须在style属性中添加以下代码:

color: yellow !important;

就像是

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

可能会成功,尽管这会覆盖任何以前的内容。我们可以尝试将我们的颜色附加到之前的内容中,但我们不能保证已经存在的 CSS 是有效的。

如果目标浏览器理解 CSS3 (*sigh*),我们可以使用一些不错的选择器来为我们完成这项工作,比如

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

where$foo保存一个健全的字符串以进行字面匹配(无正则表达式)。

这是一个数据 URL,您可以将其复制并粘贴到您的地址栏中,以查看此(希望)是否有效:

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 技巧,否则这种差异应该无关紧要。

如果你真的需要,你可以调整这个解决方案来使用字体标签。
“请不要!我们可以<span>吗?” ← 小猫。

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

于 2013-01-04T23:37:57.047 回答