Как извлечь заголовок HTML с помощью Perl?


0

Есть ли способ извлечь заголовок HTML-страницы с помощью Perl? Я знаю, что он может передаваться как скрытая переменная во время отправки формы, а затем извлекаться на Perl таким образом, но мне было интересно, есть ли способ сделать это без отправки?

Мол, позволяет сказать, что у меня есть HTML-страницу, как это:

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

, а затем в Perl я хочу сделать:

$q -> h1('something'); 

Как я могу заменить «нечто» динамически с тем, что является содержится в < title> tags?

  0

Этот вопрос немного запутан. Вы хотите узнать название страницы? Таким образом, он будет больше похож: my $ title = $ q-> h1(); правильно? Или вы хотите установить новый заголовок? 22 фев. 092009-02-22 03:06:04

7

Я бы использовал pQuery. Он работает так же, как jQuery.

Вы можете сказать:

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

Замена материал похож:

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

Вы можете передать строку HTML в pQuery конструктор, который это звучит, как вы хотите сделать.

Наконец, если вы хотите использовать произвольный HTML как «шаблон», а затем «уточните», что с помощью команд Perl вы хотите использовать Template::Refine.


-2

Если вы просто хотите извлечь заголовок страницы, вы можете использовать регулярное выражение. Я считаю, что было бы что-то вроде:

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

где ваша страница HTML хранится в строке $html. В si, s выступает за режим одиночной линии (т. Е. Точка также соответствует новой строке) и i для игнорировать регистр.

  0

Результаты будут не такими, какие вы хотите, если на странице после окончания фактического названия есть еще</title>. В общем, регулярные выражения для синтаксического анализа HTML - это ограниченное предложение. 22 фев. 092009-02-22 03:27:50


1

Непонятно, что вы просите. Вы, кажется, говорите о чем-то, что может быть запущено в браузере пользователя или, по крайней мере, о том, что уже загружено html-страницей.

Если это не случай, ответ URI::Title.


3

HTML::HeadParser делает это за вас.

  0

Ссылка, которую вы опубликовали, возвращает результаты поиска, которые не возвращают HTML :: HeadParser. Я должен был оглянуться: http://search.cpan.org/~gaas/HTML-Parser/ 23 фев. 092009-02-23 18:45:03

  0

Ах, да, модуль HTML :: HeadParser поставляется с HTML :: Parser. 23 фев. 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

Предыдущий ответ неверен, если название тега HTML используется чаще, то это легко можно преодолеть не проверяя, чтобы убедиться, что тег заголовка является действительным (нет тегов между ними).

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

0

получить название названия из файла.

    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