I would suggest to keep them as list of dataframes and to distinguish the tables, name them with the caption available
library(dplyr)
library(rvest)
url
url %>%
read_html() %>%
html_table() %>%
setNames(., url %>%
read_html() %>%
html_nodes("caption") %>%
html_text())
#$`Resident tax rates for 2016-17`
# Taxable income Tax on this income
#1 0 – $18,200 Nil
#2 $18,201 – $37,000 19c for each $1 over $18,200
#3 $37,001 – $87,000 $3,572 plus 32.5c for each $1 over $37,000
#4 $87,001 – $180,000 $19,822 plus 37c for each $1 over $87,000
#5 $180,001 and over $54,232 plus 45c for each $1 over $180,000
#$`Resident tax rates for 2015-16`
# Taxable income Tax on this income
#1 0 – $18,200 Nil
#2 $18,201 – $37,000 19c for each $1 over $18,200
#3 $37,001 – $80,000 $3,572 plus 32.5c for each $1 over $37,000
#4 $80,001 – $180,000 $17,547 plus 37c for each $1 over $80,000
#5 $180,001 and over $54,547 plus 45c for each $1 over $180,000
#......
If you want it as one single dataframe, we can use bind_rows with .id parameter
url %>%
read_html() %>%
html_table() %>%
setNames(., url %>%
read_html() %>%
html_nodes("caption") %>%
html_text()) %>%
bind_rows(.id = "id")