Ler conteúdo de página HTML

Opa,

Preciso ler uma página HTML e atribuir valores presentes em determinadas tags a variáveis.
De forma simplificada, tenho de popular uma base de dados utilizando algumas informações contidas no código-fonte dessas páginas.

Já consegui realizar esse procedimento quando, por exemplo, o valor esta entre duas tags:

<div clas="abc">
// valores
</div>

O problema é quando tenho de ler valores do tipo:

<div clas="abc">
     <select name="id1">
          //<options>
     </select>
          <select name="id2">
          //<options>
     </select>
</div>

<div clas="abc">
     <select name="id1">
          //<options>
     </select>
          <select name="id2">
          //<options>
     </select>
</div>

Preciso de todo o conteúdo, porém, como estou passando os valores iniciais e finais, só estou conseguindo verificar o conteúdo da primeira div.
Estou utilizando as classes Pattern e Matcher do pacote java.util.regex.

Se alguém já passou por algo similar ou conhece alguma lib que possua funcionalidade parecida, ficaria agradecido.
Realizei pesquisa no Google e sei que existem diversas bibliotecas, mas não consegui obter resultados em situações assim.

Pra que quiser dar um auxilio, segue fonte:

	public String getContent(String url, String start, String end) {
		String line = null;
		String content = "";

        URL address = null;
        
        InputStreamReader inputReader = null;
        BufferedReader buffReader = null;
        
       try {
		address = new URL(url);
		inputReader = new InputStreamReader(address.openStream());
		buffReader = new BufferedReader(inputReader);
		
		while ((line = buffReader.readLine()) != null)
			content += line;
        } catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			close(inputReader, buffReader);
		}

        Pattern pattern = Pattern.compile(start + ".*?" + end);
        Matcher matcher = pattern.matcher(content);

        if (!matcher.find())
        	return null;
                
        content = matcher.group(0);
        content = content.replace(start, "");
        content = content.trim();
        content = content.replace(end, "");
                
        return content;
	}

Opa, mal o vacilo…

Para que precisar, segue solução:

        while (matcher.find()) {
        	System.out.println(matcher.group());
        }