Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Analysieren Sie die HTML-Tabelle mit Oracle

Ihr path sucht nach einem td unter dem tr; aber es gibt zwei, daher der Fehler "Got Multi-Item Sequence", den Sie sehen. Sie können auf jeden td verweisen Tag durch seine Position, als td[1] usw. Es ist jedoch sehr darauf angewiesen, dass die Tabellenstruktur wie erwartet ist.

Mit diesem speziellen Beispiel können Sie Folgendes tun:

with tbl as
(
    select xmltype('
        <table>
          <tbody>
            <tr class="blue"><td>code</td><td>rate</td></tr>
            <tr class="gray_1"><td><span>USD</span><em>1</em></td><td>476.16</td></tr>
            <tr class="gray_2"><td><span>AUD</span><em>1</em></td><td>327.65</td></tr>
            <tr class="gray_9"><td><span>IRR</span><em>100</em></td><td>1.13</td></tr>
            <tr class="blue"><td>some comment</td><td>some comment</td></tr>
            <tr class="gray_1"><td><span>EUR</span><em>1</em></td><td>526.54</td></tr>
          </tbody>
        </table>
    ') xml_data from dual
)
select
    x.class, x.currency, x.amount, to_number(x.rate) as rate
from
    tbl
cross join
    xmltable('/table/tbody/tr'
        passing tbl.xml_data
        columns
            class varchar2(10) path '@class',
            currency varchar2(3) path 'td[1]/span',
            amount number path 'td[1]/em',
            rate varchar2(50) path 'td[2]'
    ) x
where
    x.currency is not null

was bekommt:

CLASS      CUR     AMOUNT       RATE
---------- --- ---------- ----------
gray_1     USD          1     476.16
gray_2     AUD          1     327.65
gray_9     IRR        100       1.13
gray_1     EUR          1     526.54

Es braucht jedoch nicht viel Variation im HTML, um es zu knacken. Siehe diese Antwort aus bestimmten Gründen ist es anfällig und warum es im Allgemeinen als unklug angesehen wird, zu versuchen, HTML als XML zu parsen.