Comment extraire un titre HTML avec Perl?


0

Existe-t-il un moyen d'extraire le titre de la page HTML en utilisant Perl? Je sais qu'il peut être passé en tant que variable cachée lors de la soumission du formulaire, puis récupéré en Perl de cette façon, mais je me demandais s'il y avait un moyen de le faire sans le soumettre?

Comme, laisse dire que j'ai une page HTML comme ceci:

<html><head><title>TEST</title></head></html> 

puis en Perl que je veux faire:

$q -> h1('something'); 

Comment puis-je remplacer « quelque chose » dynamique avec ce qui est contenu dans < title> tags?

  0

La question est un peu confuse. Vous voulez connaître le titre de la page? Donc, cela ressemblerait plus à: my $ title = $ q-> h1(); droite? Ou voulez-vous définir un nouveau titre? 22 févr.. 092009-02-22 03:06:04

7

J'utiliserais pQuery. Cela fonctionne exactement comme jQuery.

Vous pouvez dire:

use pQuery; 
my $page = pQuery("http://google.com/"); 
my $title = $page->find('title'); 
say "The title is: ", $title->html; 

Remplacement des choses est similaire:

$title->html('New Title'); 
say "The entirety of google.com with my new title is: ", $page->html; 

Vous pouvez passer une chaîne HTML au constructeur pQuery, qu'il semble que vous voulez faire. Enfin, si vous voulez utiliser du HTML arbitraire comme "modèle", puis "affiner" avec les commandes Perl, vous devez utiliser Template::Refine.


-2

Si vous souhaitez simplement extraire le titre de la page, vous pouvez utiliser une expression régulière. Je crois que ce serait quelque chose comme:

my ($title) = $html =~ m/<title>(.+)<\/title>/si; 

où votre page HTML est stockée dans la chaîne $html. Dans si, le s représente pour le mode de ligne unique (c'est-à-dire, le point correspond également à une nouvelle ligne) et i pour ignorer le cas.

  0

Résultats ne sera pas ce que vous voulez s'il y a un autre</title> sur la page après la fin du titre réel. En général, les expressions régulières pour l'analyse HTML sont une proposition limitée. 22 févr.. 092009-02-22 03:27:50


1

Ce que vous me demandez n'est pas clair. Vous semblez parler de quelque chose qui pourrait tourner dans le navigateur de l'utilisateur, ou au moins quelque chose qui a déjà une page html chargée. Si c'est pas le cas, la réponse est URI::Title.


3

HTML::HeadParser le fait pour vous.

  0

Le lien que vous avez publié renvoie des résultats de recherche qui ne renvoient pas HTML :: HeadParser. J'ai dû regarder autour de lui: http://search.cpan.org/~gaas/HTML-Parser/ 23 févr.. 092009-02-23 18:45:03

  0

Ah, oui, le module HTML :: HeadParser est livré avec HTML :: Parser. 23 févr.. 092009-02-23 19:03:24


1
use strict; 
use LWP::Simple; 

my $url = 'http://www.google.com'|| die "Specify URL on the cmd line"; 
my $html = get ($url); 
$html =~ m{<TITLE>(.*?)</TITLE>}gism; 

print "$1\n"; 

1

La réponse précédente est fausse, si la balise de titre HTML est utilisé plus souvent cela peut facilement être surmonté en vérifiant pour vous assurer que la balise de titre est valide (pas de balises entre les deux).

my ($title) = $test_content =~ m/<title>([a-zA-Z\/][^>]+)<\/title>/si; 

0

Obtenez le nom du titre à partir du fichier.

    my $spool = 0; 

        open my $fh, "<", $absPath or die $!; 
        #open ($fh, "<$tempfile"); 
        # wrtie the opening brace 
        print WFL "["; 
      while (<$fh>) { 
        # removes the new line from the line read 
         chomp; 
        # removes the leading and trailing spaces. 
        $_=~ s/^\s+|\s+$//g; 
      # case where the <title> and </title> occures in one line 
      # we print and exit in one instant 
       if (($_=~/$startstring/i)&&($_=~/$endstring/i)) { 

         print WFL "'"; 

        my ($title) = $_=~ m/$startstring(.+)$endstring/si; 
         print WFL "$title"; 
         print WFL "',"; 
         last; 
         } 
      # case when the <title> is in one line and </title> is in other line 

      #starting <title> string is found in the line 
       elsif ($_=~/$startstring/i) { 

         print WFL "'"; 
      # extract everything after <title> but nothing before <title>  
        my ($title) = $_=~ m/$startstring(.+)/si; 
         print WFL "$title"; 
         $spool = 1; 
         } 
      # ending string </title> is found 
       elsif ($_=~/$endstring/i) { 
      # read everything before </title> and nothing above that         
        my ($title) = $_=~ m/(.+)$endstring/si; 
         print WFL " "; 
         print WFL "$title"; 
         print WFL "',"; 
         $spool = 0; 
         last; 
         } 
      # this will useful in reading all line between <title> and </title> 
       elsif ($spool == 1) { 
         print WFL " "; 
         print WFL "$_"; 

         } 

        } 
     close $fh; 
     # end of getting the title name