PostgreSQL -替换HTML实体

r7knjye2  于 2023-04-29  发布在  PostgreSQL
关注(0)|答案(3)|浏览(157)

我刚刚开始从数据库中剥离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(..);/,然后将 just%1部分传递给ascii解码器,并重建字符串。...什么的..
我要继续提问吗?可能只有40个左右。

9gm1akwq

9gm1akwq1#

使用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)
oalqel3c

oalqel3c2#

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

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

8oomwypt3#

这就是我在Ubuntu 18上工作的原因。04与PG10,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;

相关问题