如何提取 html 文本中的所有粗体字

How to extract every bold words in a html text

我有这样的文字。

<div>
    blabla <b> BOLD </b> babla <b> BOLD2</b> blabla
    <table width="100%">
    <tr>
        <td valign="top" style="width:30px">-</td>
       <td>blabla <b>BOLD3</b></td>
  </tr> 
</div>


我想提取b标签之间的单词。但是有几条路。

SELECT  t1,t2
       FROM mytext,
            XMLTABLE (
                '/div'
                PASSING xmltype (raw_text.inhalt)
                COLUMNS t2     VARCHAR2 (1000) PATH './b',              --
                        t1     VARCHAR2 (1000) PATH './table/tr/td/b'))

[Error] Execution (11: 1): ORA-19279: XPTY0004 - XQuery dynamic type mismatch: expected singleton sequence - got multi-item sequence

假设您的 HTML 是有效的 XML(情况并非总是如此,因为它需要一个根节点并关闭所有开始标签)然后给出示例数据:

CREATE TABLE mytext (rawtext  CLOB);

INSERT INTO mytext (rawtext) VALUES (
'<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/TR/xhtml1/strict" >
  <div>
    blabla <b> BOLD </b> babla <b> BOLD2</b> blabla
    <table width="100%">
      <tr>
        <td valign="top" style="width:30px">-</td>
        <td>blabla <b>BOLD3</b></td>
      </tr>
    </table>
  </div>
</html>'
);

那么你可以使用:

SELECT bold
FROM   mytext m
       CROSS JOIN XMLTABLE (
         XMLNAMESPACES(DEFAULT 'http://www.w3.org/TR/xhtml1/strict'),
         '//b'
         PASSING XMLTYPE(m.rawtext)
         COLUMNS bold VARCHAR2(1000) PATH './text()'
       )

输出:

BOLD
BOLD
BOLD2
BOLD3

db<>fiddle here

这个版本也可以。而且您不必添加更多 html 标记。 您只需删除 XMLNAMESPACES(DEFAULT 'http://www.w3.org/TR/xhtml1/strict')

CREATE TABLE mytext (
  rawtext  CLOB
);

INSERT INTO mytext (rawtext) VALUES (
'<div>
    blabla <b> BOLD </b> babla <b> BOLD2</b> blabla
    <table width="100%">
      <tr>
        <td valign="top" style="width:30px">-</td>
        <td>blabla <b>BOLD3</b></td>
      </tr>
    </table>
  </div>'
);

SELECT bold
FROM   mytext m
       CROSS JOIN XMLTABLE (
         '//b'
         PASSING XMLTYPE(m.rawtext)
         COLUMNS bold VARCHAR2(1000) PATH './text()'
       )

https://dbfiddle.uk/?rdbms=oracle_21&fiddle=0889004081eb0c86bf3b869d953cf04e