PostgreSQL-替换HTML实体

PostgreSQL-替换HTML实体,sql,regex,postgresql,replace,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%';

我刚刚开始从数据库中剥离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个左右。

使用pl/perlu编写函数并使用此模块

当然,您需要安装perl并提供pl/perl

一, 首先,创建过程语言pl/perlu:

CREATE EXTENSION plperlu;
2然后创建如下函数:

CREATE FUNCTION decode_html_entities(text) RETURNS TEXT AS $$
    use HTML::Entities;
    return decode_entities($_[0]);
$$ LANGUAGE plperlu;
select decode_html_entities('aaabbb&.... asasdasdasd …');
   decode_html_entities    
---------------------------
 aaabbb&.... asasdasdasd …
(1 row)
3然后你可以这样使用它:

CREATE FUNCTION decode_html_entities(text) RETURNS TEXT AS $$
    use HTML::Entities;
    return decode_entities($_[0]);
$$ LANGUAGE plperlu;
select decode_html_entities('aaabbb&.... asasdasdasd …');
   decode_html_entities    
---------------------------
 aaabbb&.... asasdasdasd …
(1 row)

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

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

这就是我使用PG10开发Ubuntu18.04的原因,Perl没有解码一些实体,比如&逗号;出于某种原因。所以我用了蟒蛇3

从命令行

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;

如果你这样做的话,你会想要积极地抽真空,以避免巨大的桌子膨胀。正如@SzymonGuz所解释的,在PL中进行文本处理是迄今为止更好的方法。在SQL中使用子字符串或regexp_匹配和替换表是可能的,但这将是缓慢而难看的。感谢真空提示,我将对此进行研究。谢谢,我希望不必跳转到perl,但我想纯粹的SQL解决方案要求太多了!当然,这也很容易,但是比那两行perl代码长得多;看起来像postgre XML处理中的错误。