PostgreSQL - 替换HTML实体

时间:2012-08-27 16:13:53

标签: sql regex postgresql replace

我刚刚开始从我们的数据库中删除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%';

这显然是一种非常天真的方法。我一直试图弄清楚我能用解码功能做些什么聪明的事情;也许像/&#x(..);/这样的正则表达式抓取html实体,然后将只是 %1部分传递给ascii解码器,并重构字符串......或者其他......

我应该继续查询?可能只有40个左右。

3 个答案:

答案 0 :(得分: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&amp;.... asasdasdasd &hellip;');
   decode_html_entities    
---------------------------
 aaabbb&.... asasdasdasd …
(1 row)

答案 1 :(得分:2)

您可以使用xpath(HTML编码的内容与XML编码的内容相同):

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

答案 2 :(得分:0)

这就是我使用PG10开发Ubuntu 18.04所需要的,并且Perl由于某些原因未解码某些实体,例如&comma;。所以我用了Python3。

从命令行

sudo apt install postgresql-plpython3-10

从您的SQL界面:

CREATE LANGUAGE plpython3u;

CREATE OR REPLACE  FUNCTION htmlchars(str TEXT) RETURNS TEXT AS $$
    from html.parser import HTMLParser
    h = HTMLParser() 
    if str is None:
        return str
    return h.unescape(str);
$$ LANGUAGE plpython3u;