PostgreSQL-替换HTML实体
我刚刚开始从数据库中剥离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%';
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&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处理中的错误。