1

別のスクリプト(私が制御していない)が生成するページで、リンク内のリンクテキストの色を黄色に変更しようとしています。具体的には、このページの2つの表で特定のテキストを検索しています。テキスト(ハイパーリンク)を見つけたら、色を黄色に変更したいと思います。

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>タグを使用するたびに、セマンティックマークアップが約束された怒っているwebdevにかわいい子猫の大群を犠牲にする必要があります。フォント自体にはセマンティクスがありません。代わりに、そのようなことは、要素の色を変更するのに驚くほど優れているCSSを介して簡単に行うことができます。

1つの要素の色を黄色に設定するには、style属性に次のコードを追加する必要があります。

color: yellow !important;

何かのようなもの

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

以前の内容を上書きしますが、うまくいく可能性があります。以前のコンテンツに色を追加することもできますが、すでに存在するCSSが有効であるという保証はありません。

ターゲットブラウザがCSS3(* sigh *)を理解している場合は、いくつかの優れたセレクターを使用して、次のような仕事をすることができます。

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

ここで$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>もう1つの解決策は、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 に答える