2012-08-27 50 views
3

我剛纔着手從我們的數據庫中剝離出來的HTML實體的任務,因爲我們做了很多抓取和一些爬蟲並沒有在輸入時間做到這一點:(PostgreSQL的 - 替換HTML實體

於是我開始寫一堆看起來像查詢;

UPDATE nodes SET name=regexp_replace(name, 'à', 'à', 'g') WHERE name LIKE '%#xe0%'; 
UPDATE nodes SET name=regexp_replace(name, 'á', 'á', 'g') WHERE name LIKE '%#xe1%'; 
UPDATE nodes SET name=regexp_replace(name, 'â', 'â', 'g') WHERE name LIKE '%#xe2%'; 

其中明確是一個很天真的做法我一直在試圖找出是否有一些聰明我可以用解碼功能做。也許搶奪正則表達式的HTML實體像/&#x(..);/,然後通過只是%1 p藝術到ascii解碼器,並重建字符串...或東西...

我只需要按查詢?可能只有40個左右。

+0

如果你這樣做,以避免巨大的表膨脹你會想'VACCUM'積極。 @SzymonGuz解釋說,在PL中進行文本處理是更好的方法。在SQL中可以使用'substring'或'regexp_matches'和一個替換表,但是它會很慢並且很難看。 –

+0

感謝VACCUM小費,我會研究一下。 – lynks

回答

5

使用PL/perlu編寫一個函數,使用這個模塊https://metacpan.org/pod/HTML::Entities

當然,你需要安裝Perl和PL/perl的使用。

1)所有的 首先創建過程語言PL/perlu:

CREATE EXTENSION plperlu; 

2)然後創建一個功能是這樣的:

CREATE FUNCTION decode_html_entities(text) RETURNS TEXT AS $$ 
    use HTML::Entities; 
    return decode_entities($_[0]); 
$$ LANGUAGE plperlu; 

3)然後你可以這樣使用它:

select decode_html_entities('aaabbb&.... asasdasdasd …'); 
    decode_html_entities  
--------------------------- 
aaabbb&.... asasdasdasd … 
(1 row) 
+0

謝謝,我希望不必跳進Perl,但我猜一個純粹的SQL解決方案會有點太多要求! – lynks

+0

那麼,它會很容易,但是比那兩行Perl代碼長得多。 –

+0

需要apt-get install postgresql-plperl-9.1 –

1

您可以使用XPath(HTML編碼的內容是相同的XML編碼的內容):

select 
    'AT&T' as input , 
    (xpath('/z/text()', ('<z>' || 'AT&amp;T' || '</z>')::xml))[1] as output 
+0

到目前爲止理論,但是這個突破ö看起來像postgre-XML處理中的一個錯誤。 –