2013-01-04 5 views
1

J'essaie de changer la couleur du texte du lien dans un lien vers le jaune sur une page qu'un autre script (non contrôlé par moi) génère. Plus précisément, je cherche un texte spécifique dans deux tableaux sur cette page. Une fois que je trouve le texte (qui sont des hyperliens), je veux changer leur couleur en jaune. J'utilise HTML :: Element et je peux facilement trouver le texte. Le problème est qu'il n'y a pas de couleur de lien spécifiée, donc les liens utilisent la valeur par défaut de bleu. J'essaye d'ajouter l'élément HTML de couleur de police à la balise mais je n'ai pas beaucoup de chance.Perl - Changer la couleur d'un lien en utilisant HTML :: Element

Si j'essayer d'utiliser quelque chose comme (où « $ a » est le HTML :: Element objet pour le lien, je suis en train de modifier):

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

Il ajoute l'attribut mais ne change pas la couleur du texte du lien.

si je tente quelque chose comme:

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

Cela ajoute que le texte

<font color=yellow> 

au contenu sans, encore une fois, en changeant la couleur du texte de contenu réel.

Essayer de l'épisser ne fonctionne pas non plus.

J'ai finalement frappé sur ce:

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"; 

qui fonctionne à merveille dans le sens où il crée:

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

Mais ce changement ne se reflète pas dans le document html!

Je ne sais pas comment insérer l'attribut de couleur de police dans le document html original.

Voici mon script complet. C'est un désordre parce que j'ai essayé une variété de méthodes différentes sans succès.

#!/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"; 
    } 
} 

Répondre

3

Chaque fois que quelqu'un utilise la balise <font>, nous devons sacrifier un hecatomb de cute kittens aux webdevs en colère qui ont été promis un balisage sémantique. Une police en elle-même n'a pas de sémantique. Au lieu de cela, de telles choses peuvent être facilement effectuées via CSS qui excelle sans surprise à changer la couleur des éléments.

Pour définir la couleur d'un élément au jaune, il faut ajouter le code suivant à l'attribut style:

color: yellow !important; 

Quelque chose comme

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

est susceptible de faire l'affaire, bien que cela écraserait tout contenu précédent. Nous pourrions essayer d'ajouter notre couleur au contenu précédent, mais nous n'avons aucune garantie que le CSS déjà là est valide.

Si les navigateurs cibles comprennent CSS3 (* soupir *), on peut utiliser des sélecteurs agréables pour faire ce travail pour nous, comme

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

$foo contient une chaîne saine d'esprit pour être littéralement adapté (pas regexes).

Voici une URL de données que vous pouvez copier & coller dans la barre d'adresse pour voir ce (je l'espère) travail:

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> 

L'autre solution serait de créer un nouvel élément <span> qui porte le CSS, et est le seul enfant du lien. Les anciens enfants de <a> seraient alors enfants du <span>. Ceci est légèrement différent de la solution précédente, mais cette différence ne devrait pas avoir d'importance à moins que certaines astuces CSS avancées aient été utilisées dans la mise en page.

Si vous avez vraiment à, vous pouvez adapter cette solution pour utiliser les balises de police.
"Pouvons-nous ne pas! Peut-on être dangereux <span>?" ← les chatons.

Pour voir ce que vous pouvez faire avec les objets d'élément HTML, voir le HTML::Element documentation.

+0

Merci pour la réponse mais je ne peux pas utiliser CSS. La page Web est créée par un script automatisé qui dégorge juste HTML sans n'importe quel lien de CSS et je ne peux pas ajouter n'importe quel CSS (règles d'entreprise). Ma seule et unique solution est l'édition du code HTML que le script génère. –

+0

@phileasfogg Comme je l'ai dit, la solution pour '' peut être facilement adaptée pour utiliser des balises de police, ce qui ne nécessiterait pas de CSS. Fondamentalement 'HTML :: Element-> new (" font ", color =>" jaune ")'. Sachez que la balise '' est apparue dans HTML 3.2, qu'elle était obsolète dans HTML 4.0 Transitional, et qu'elle est * invalide * dans HTML 4.0 Strict et versions ultérieures, donc assurez-vous de vérifier d'abord le doctype. – amon

+0

Ah, désolé, n'a pas lu votre commentaire initial assez près, désolé à ce sujet. Merci encore pour votre aide. –

Questions connexes