6

多くのクロールを実行し、一部のクローラーは入力時にこれを実行しなかったため、データベースから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(..);/をASCIIデコーダーに渡して、文字列を再構築します...または何か...%1

クエリを押し続けましょうか。おそらく40かそこらしかないでしょう。

4

3 に答える 3

7

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)
于 2012-08-27T19:30:11.527 に答える
5

xpathを使用できます(HTMLエンコードされたコンテンツはXMLエンコードされたコンテンツと同じです):

select 
  'AT&T' as input ,
  (xpath('/z/text()', ('<z>' || 'AT&amp;T' || '</z>')::xml))[1] as output 
于 2013-01-09T12:09:23.117 に答える
1

これは私がPG10でUbuntu18.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;
于 2019-06-20T00:23:18.880 に答える