2012-04-02 35 views
2

我使用Perl收穫了一個網站,但我在開始時遺漏了一些東西。現在,當我開始上傳數據時,我看到一些奇怪的字符,如í等等。 字符串是Líder de Projetos但我得到了Líder de Projetos。我有大約50GB的40個文本文件在一起。取得í代替í,當使用Perl腳本收穫/抓取時

我怎樣才能解決它們而不收穫?

+1

伯尼「perl」標籤。 – ikegami 2012-04-02 18:09:52

+0

不,那就是我! – 2012-04-02 19:18:06

+0

只是說編輯日誌說什麼。編輯日誌不顯示刪除任何東西。它只是顯示他添加了「perl」標籤。 – ikegami 2012-04-02 19:32:36

回答

3

您看到的字符串在此上下文中稱爲character entity references或更常見HTML實體。它們是一種使用它們在不支持字符的有限字符編碼中表示的字符的方式。你看到這個代替重音的「我」,因爲當你收穫內容時,你沒有明確地告訴「收割者」如何處理這些角色。也許原始頁面使用這些實體引用,或者「收割者」認爲這是你想要的,並將字符轉換爲實體引用。

爲了「修復」這些,你必須準確地決定你想要處理的內容。即:什麼是使用這些數據。一旦你弄清楚你至少有幾個選擇。

  1. 什麼都不做:如果你發送此內容的東西,使用有限的字符集,像ASCII,並知道如何使用這些實體引用,那麼你很可能只是確定讓他們在那裏。例如,如果您只是使用這些來生成更多的網頁,那麼您可以保持原樣並在瀏覽網頁時正確顯示它們。如果你知道你發送這些東西的東西可以支持Unicode表示(例如:UTF-8),那麼你可以使用decode_entities()函數從這裏獲取decode_entities()函數,模塊將這些字符串轉換爲unicode字符。如果你這樣做,應該意識到你可能需要作爲實體表示保留的某些東西將被解碼,並且你可能需要重新編碼它們或以某種方式防止它們被解碼。

2

í是用於與十六進制序數值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 
0
#!/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; 
+0

總是檢查這些調用的結果以「打開」。另外,你不需要啜泣整個文件來做到這一點。請注意,他只有40個文件中有50GB的信息。而且,是什麼讓你認爲序數值只會是兩個字符? – 2012-04-02 18:40:20

+0

@briandfoy - 我相信這裏的每個人都知道'或者死亡;'每個文件1.25 GB並不壞,這個簡單易用的代碼會快速完成 - 新的「收穫」要快得多。是的,我希望西班牙文中只有兩個字符'&#x..;'。 – 2012-04-02 18:47:11

+0

@briandfoy - 我剛剛測試了1.25 GB的HTML文件,僅用了0.3878秒。在虛擬服務器上 – 2012-04-02 18:52:54