How can I traverse HTML DOM with Swift

Viewed 101

I have an http POST response which I receive in HTML. Now I want to display the results in my view Controller. How can I parse the DOM of the response to get the elements I want?

This is the response in raw html:

<tr>
  <td style="text-align:center;">1</td>
  <td>9.99</td>
  <td style="text-align:center;" class="show_on_masters hide"></td>
  <td style="text-align:center;">1.4</td>
  <td><a href="https://athletics.ca/wp-content/themes/default-bs3/popups/athlete-rankings.php?id=9487257&year=2021" class="fancybox" data-fancybox-type="iframe">DE GRASSE, ANDRE</a></td>
  <td style="text-align:center;">ON</td>
  <td>
    <div data-tooltip="Speed Academy Athletics Club"><a href="http://www.speedacademy.ca" target="_blank">SAAC</a></div>
  </td>
  <td>94</td>
  <td><a href="https://www.tfrrs.org/results/68975/UF_Tom_Jones_Invitational/" target="_blank">2</a></td>
  <!--<td class="rankings_hide_992">UF Tom Jones Invitational (Olympic Development)</td>-->
  <!--<td class="rankings_hide_768">Gainesville , FL</td>-->
  <td>
    <div data-tooltip="UF Tom Jones Invitational (Olympic Development)" style="cursor:default;">Gainesville , FL</div>
  </td>
  <td>17/04/2021</td>
</tr>
<tr>
  <td style="text-align:center;">2</td>
  <td>10.08</td>
  <td style="text-align:center;" class="show_on_masters hide"></td>
  <td style="text-align:center;">1.9</td>
  <td><a href="https://athletics.ca/wp-content/themes/default-bs3/popups/athlete-rankings.php?id=9256053&year=2021" class="fancybox" data-fancybox-type="iframe">BROWN, AARON</a></td>
  <td style="text-align:center;">ON</td>
  <td>
    <div data-tooltip="Phoenix Athletics Assoc. of Ontario"><a href="http://phoenixathletics.ca" target="_blank">PHNX</a></div>
  </td>
  <td>92</td>
  <td><a href="http://live.halfmiletiming.com/meets/294/events" target="_blank">7</a></td>
  <!--<td class="rankings_hide_992">World Athletics - Miramar</td>-->
  <!--<td class="rankings_hide_768">Miramar, FL</td>-->
  <td>
    <div data-tooltip="World Athletics - Miramar" style="cursor:default;">Miramar, FL</div>
  </td>
  <td>10/04/2021</td>
</tr>
<tr>
  <td style="text-align:center;">3</td>
  <td>10.14</td>
  <td style="text-align:center;" class="show_on_masters hide"></td>
  <td style="text-align:center;">0.7</td>
  <td><a href="https://athletics.ca/wp-content/themes/default-bs3/popups/athlete-rankings.php?id=8989428&year=2021" class="fancybox" data-fancybox-type="iframe">WARNER, DAMIAN</a></td>
  <td style="text-align:center;">ON</td>
  <td>
    <div data-tooltip="London Western T.F.C."><a href="http://www.londonwesterntfc.com/" target="_blank">LWTF</a></div>
  </td>
  <td>89</td>
  <td><a href="https://www.worldathletics.org/competition/calendar-results/results/7155327" target="_blank">1dec5</a></td>
  <!--<td class="rankings_hide_992">Hypo-Meeting</td>-->
  <!--<td class="rankings_hide_768">Götzis, AUT</td>-->
  <td>
    <div data-tooltip="Hypo-Meeting" style="cursor:default;">Götzis, AUT</div>
  </td>
  <td>29/05/2021</td>
</tr>

I'm currently trying to use HTMLKit based on a couple tutorials, but I can't truly traverse the DOM with this library. Any ideas?

HTMLKit Tutorial

HTMLKit Video Tutorial

1 Answers

You can try SwiftSoup library that allows HTML parsing.

Usage

do {
    let html: String = "<p>An <a href='http://example.com/'><b>example</b></a> link.</p>";
    let doc: Document = try SwiftSoup.parse(html)
    let link: Element = try doc.select("a").first()!
    
    let text: String = try doc.body()!.text(); // "An example link"
    let linkHref: String = try link.attr("href"); // "http://example.com/"
    let linkText: String = try link.text(); // "example""
    
    let linkOuterH: String = try link.outerHtml(); // "<a href="http://example.com"><b>example</b></a>"
    let linkInnerH: String = try link.html(); // "<b>example</b>"
} catch Exception.Error(let type, let message) {
    print(message)
} catch {
    print("error")
}
Related