2015-10-14 3 views
1

Я пишу скрипт Perl, который извлекает различные HTML-документы со многих разных веб-сайтов и пытается извлечь данные из них. У меня проблема с расшифровкой этих документов.Какая кодировка Perl, для которой установлен набор символов HTML?

Я знаю, как читать charset из метатега, если таковой существует, и как читать эту информацию из HTTP-заголовка, если он доступен.

Результаты могут быть:

  • UTF-8
  • ISO-8859-1
  • Shift_JIS
  • Окна-1252

и многое другое

С это знание Я хочу, чтобы декодировать документ в моем скрипте на Perl

#!/usr/bin/perl -w 

use strict; 

use LWP::UserAgent; 
use Encode; 
use Encode::JP; 

# Maybe also use other extensions for Encode 

my $ua = LWP::UserAgent->new; 
my $response = $ua->get($url); #$url is the documents URL 

if ($response->is_success) { 

    my $charset = getcharset($response); 
    # getcharset is a self-written subroutine that reads the charset 
    # from a meta tag or from the HTTP header (not shown in this example) 

    # Now I know the documents charset and want to find its encoding: 

    my $encoding = 'utf-8'; # default 

    if ($charset eq 'utf-8') { 
     $encoding = 'utf-8'; # Here $encoding and $charset are equal 

    } 
    elsif ($charset eq 'Shift_JIS') { 
     $encoding = 'shiftjis'; #here $encoding and $charset are not equal 
    } 
    elsif ($charset eq 'windows-1252') { 
     # Here I have no idea what $encoding should be, since there is no 
     # encoding in the documentation that contains the string "windows" 

    } 
    elsif ($charset eq 'any other character set') { 
     $encoding = ??? 
    } 

    my $content = decode($encoding, $result->content); 

    # Extract data from $content 
} 

Но я не могу найти правильные кодировки для некоторых кодировок, которые существуют там в дикой природе.

+0

Вы должны «использовать предупреждения», предпочитая '-w' на линии shebang – Borodin

ответ

3

Для HTML документов, все, что вам нужно, это

my $content = $response->decoded_content(); 

Он будет использовать как значение кодировок атрибута в заголовке HTTP и META элемент при необходимости.

Но я не могу найти правильные кодировки для некоторых кодировок, которые существуют там в дикой природе.

Encode не support все кодировки, которые когда-либо существовали, но я удивлен, что вы столкнулись страницу HTML не может декодировать. Это может быть просто случай создания псевдонима, но вы не предоставили никаких подробностей для нас, чтобы помочь вам.

1

См. Encode::Supported. В основном, большинство кодировок должно просто работать ™.

binmode STDIN, ':encoding(Shift_JIS)'; 
binmode STDIN, ':encoding(windows-1252)'; 

Оба работают без ошибок.

+1

Что это значит для декодирования HTTP-ответов? – ikegami

+0

Означает ли это, что ** каждое ** кодированное имя, которое я найду в ** любом ** html-документе, также является допустимым именем кодировки, которое я могу использовать в модуле «Кодировать»? Если это так, почему этот важный факт не упоминается в документации этого модуля? –

+0

@ HubertSchölnast: Нет, но большинство из них. – choroba

Смежные вопросы