我该如何解码HTML实体?

26

这是一个快速的Perl问题:

我该如何将HTML特殊字符(如ü')转换为普通的ASCII文本?

我从以下代码开始尝试:

s/\&#(\d+);/chr($1)/eg;

我可以为所有HTML字符编写它,但是可能已经存在一些类似的函数?

请注意,我不需要完整的HTML->文本转换器。 我已经使用HTML::Parser解析了HTML。 我只需要转换我得到的特殊字符的文本。

6个回答

59

看一下HTML::Entities

use HTML::Entities;

my $html = "Snoopy & Charlie Brown";

print decode_entities($html), "\n";
您可以猜测输出结果。

2
对于喜欢 CLI 单行命令的人:perl -MHTML::Entities -le 'print decode_entities("¿'") - Brian Duncan
很棒的答案 - 这对我的工作有所帮助! - Gordon

23
上面的答案告诉你如何将实体解码为Perl字符串,但你还问了如何将它们转换为ASCII
假设这确实是您想要的,并且您不需要所有的Unicode字符,您可以查看CPAN上的Text::Unidecode模块来将所有这些奇怪的字符转换为大致相似的ASCII字符集合。
use Text::Unidecode qw(unidecode);
use HTML::Entities qw(decode_entities);

my $source = '北亰';  
print unidecode(decode_entities($source));

# That prints: Bei Jing 

7
请注意,还有十六进制指定字符。它们看起来像这样:é (é)。
使用HTML::Entities的decode_entities将实体转换为实际字符。要将其转换为ASCII需要更多的工作。我过去曾经成功地使用了带有变音选项的iconv(perl接口:Text::Iconv)。但是,如果您只处理一组有限的实体,或者您实际上不需要将其简化为ASCII等效项,则最好限制decode_entities产生的内容或为其提供自定义转换映射。请参阅HTML::Entities文档。

3

有一些预定义的HTML实体 - & " >等 - 您可以硬编码。

但是,更大量的数字实体 - { - 将会更加困难,因为这些值是Unicode,转换为ASCII将从难以不可能范围内。


没错,Bevan。从Unicode到“纯ASCII”的反向转换是不存在的。Joel写了一篇非常好的关于文本编码的文章,dehmann应该读一下... - AmbroseChapel
1
“所有有关“纯文本= ASCII = 字符为8位”的说法不仅是错误的,而且是完全错误的。如果您仍然以这种方式编程,那么您就不比不相信细菌的医生好多少。” 该文章详细介绍了Unicode编码和字符集的重要性,并解释了在现代编程中正确处理文本的必要性。 - AmbroseChapel
1
Perl:让困难变得可能 - daxim

0

我已经创建了一个基于Perl的Bash单行命令,用于解码传递给Perl的HTML实体。我的解决方案是这个答案(请参见上文)和我上周在commandlinefu.com上发现的内容的混合。

我们大多数在Bash中编写代码的人不习惯使用echo -n来去除\n换行符,因为它通常不会影响Bash文本解析。但是对于Perl——尤其是这种方法——使用echo -n非常重要,否则perl将把“换行”\n字符解释为响应的文字部分,从而在结果中添加一个不需要的%0A

这是我的Bash-Perl单行命令混合:

encodedURL="$(echo -n "$entityURL" | perl -MHTML::Entities -MURI::Escape -ne 'print uri_escape(decode_entities($_))')"

示例:

输入:Seals \& Croft - Summer Breeze

输出:Seals%20%26%20Croft%20-%20Summer%20Breeze


0

我使用这个脚本。将其保存为html2utf.py,并像这样使用它:echo $some_html | html2utf.py

#!/usr/bin/env python3
"""
An alternative for `perl -Mopen=locale -MHTML::Entities -pe '$_ = decode_entities($_)'` (which you can use by `cpanm HTML::Entities`) and `recode html..`.
"""

import fileinput
import html

for line in fileinput.input():
    print(html.unescape(line.rstrip('\n')))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接