I separated out the table section that I wanted like this :
html = html.Replace(Chr(10), "") ' HTML page with line feeds removed
Dim start As Int = html.IndexOf($"<table id="performances">"$)
Dim stop As Int = html.IndexOf2($"</table>"$, start)
If (stop > start) Then
html = html.SubString2(start, stop + 8)
extractList
End If
The section that I was interested in had a unique start tag (looks like your does too) so you grab everything up to the next </table> tag. Removing the line feeds first helps clean thing up and prepares for Regex searches. Even if you intend to use an XML parser I think that cutting the HTML down to size in this way makes things easier to manage.
I was able to pick out the items that I wanted by a Regex search for <class ...> tags ...
Private Sub extractPerformance(data As String, p As performance)
Dim pattern As String = $"class=.+?>[^\<]*"$
Dim m As Matcher = Regex.Matcher(pattern, data)
Do While m.Find
item = m.Match
If item.StartsWith($"class="association""$) Then p.association = extractData(item)
If item.StartsWith($"class="place""$) Then p.place = extractData(item)
If item.StartsWith($"class="address""$) Then p.address = extractData(item)
If item.StartsWith($"class="changes""$) Then changes = extractData(item)
If item.StartsWith($"class="title""$) Then p.title = changes & " " & extractData(item)
If item.StartsWith($"class="footnote""$) Then p.footnote = p.footnote & " " & extractData(item)
Loop
End Sub
' Extract the data content from a RegEx match item
Private Sub extractData(item As String) As String
Dim result As String
result = item.SubString(item.IndexOf(">") + 1) "
Return result
End Sub
This is very low tech but quite flexible; I am not very good at Regex. I don't expect that it will be a perfect fit for your situation, but I hope that it might give you some ideas