获取&#x;代替;,使用Perl脚本获取/刮取时
我使用Perl创建了一个网站,但一开始我就错过了一些东西。现在,当我开始上传数据时,我看到一些奇怪的字符,如获取&#x;代替;,使用Perl脚本获取/刮取时,perl,character-encoding,web-scraping,Perl,Character Encoding,Web Scraping,我使用Perl创建了一个网站,但一开始我就错过了一些东西。现在,当我开始上传数据时,我看到一些奇怪的字符,如í和更多类似的代码。 字符串是Líder de Projetos,但我得到了L;项目顺序。我总共有40个大约50GB的文本文件 如何在不再次获取的情况下修复它们?您看到的字符串在此上下文中被称为HTML实体,或者更常见。它们是一种使用它们在不支持字符的有限字符编码中表示的字符的方法。你可以在重音“i”的地方看到这一点,因为当你获取内容时,你没有明确告诉“收割机”如何处理这些类
í代码>和更多类似的代码。
字符串是Líder de Projetos
,但我得到了L;项目顺序
。我总共有40个大约50GB的文本文件
如何在不再次获取的情况下修复它们?您看到的字符串在此上下文中被称为HTML实体,或者更常见。它们是一种使用它们在不支持字符的有限字符编码中表示的字符的方法。你可以在重音“i”的地方看到这一点,因为当你获取内容时,你没有明确告诉“收割机”如何处理这些类型的角色。可能原始页面使用了这些实体引用,或者“harvester”假设这是您想要的,并将字符转换为实体引用
为了“修复”这些问题,你必须准确地决定你想对这些内容做什么。即:什么将使用此数据。一旦你明白了这一点,你至少有两个选择
什么也不做:如果您要将此内容发送到使用有限字符集(如ASCII)的对象,并且知道如何使用这些实体引用,那么您可能可以将它们留在那里。例如,如果您只是使用这些来生成更多的网页,那么您可以让它们保持原样,并在查看网页时正确显示它们
使用perl模块对其进行解码,如:如果您知道要发送这些内容的对象可以支持Unicode表示(例如:UTF-8),则可以使用此模块中的Decode_entities()函数将这些字符串转换为Unicode字符。如果您这样做,请注意您可能需要保留为实体表示的某些内容将被解码,您可能需要重新编码它们或以某种方式阻止它们被解码
í
是具有十六进制序数值的字符的实体转义ED
。你确定来源不是这样吗
如果要将其替换为字符值,请使用模块对其进行解码:
use v5.10.1;
binmode STDOUT, ':utf8';
use XML::Entities;
my $encoded = "Líder de Projetos";
my $decoded = XML::Entities::decode('all', $encoded);
say $decoded;
现在,输出没有实体:
Líder de Projetos
#/usr/bin/perl
严格使用;
使用警告;
$/=未定义;
my$file='test.txt';
打开文件“$FILE”或模具;
打印文件$;
关闭文件;
始终检查调用open
的结果。此外,您不需要使用整个文件来执行此操作。请注意,他在40个文件中有50GB的信息。还有,是什么让你认为序数值只有两个字符?@briandfoy-我相信这里的每个人都知道或者死代码>和每个文件1.25 GB并没有那么糟糕,这个简单易懂的代码将非常快地完成它——比新的“收获”快得多。是的,我希望只有两个字符和#x西班牙语文本的code>。@briandfoy-我刚刚测试了1.25GB的HTML文件,只花了0.3878秒。在虚拟服务器上,我不关心fast。您需要有1.5GB的可用空间才能加载文件。要做得更好很容易,你需要努力工作来制造潜在的问题。如果您相信每个人都知道die
,那么您没有足够长的时间看到所有不需要问的问题,因为人们不知道如何检查返回值。@briandfoy-我编辑了我的答案并或die代码>已添加。我的代码不是通用的完美代码,但它解决了问题作者的问题-我相信他正在寻找快速解决错误的方法…只需说出编辑日志所说的话。编辑日志根本不显示bernie正在删除任何内容。这只是显示他添加了“perl”标记。这可能是一个新手问题,已经被问了很多,也回答了很多,但在你投票否决之前,请记住以下几点。有很多问题询问如何解码实体引用,但没有一个好问题回答“什么是&…;
的意思”。这是一个很难用网络搜索从头开始研究的概念,因为它几乎都是标点符号。阅读HTML书籍时,研究并不难。你不必在遇到问题的那一刻就通过网络搜索了解一切。
#!/usr/bin/perl
use strict;
use warnings;
$/ = undef;
my $file = 'test.txt';
open FILE, "<$file" or die;
$_ = <FILE>;
close FILE;
s/&#x(..);/{chr(hex($1))}/ige;
open FILE, ">$file" or die;
print FILE $_;
close FILE;