La tabla muestra 10 columnas. La exportas. El CSV tiene 10 columnas.
Pero la página tiene 15 columnas de datos. ¿Dónde fueron las otras 5?
Las tablas HTML suelen contener más datos de los que son visibles. Columnas ocultas, atributos data, filas colapsadas — todo invisible para los métodos de extracción básicos.
Aquí te muestro cómo encontrar y extraer los datos que no se ven.
Tipos de Datos Ocultos
1. Columnas Ocultas con CSS
El caso más simple: las columnas existen en el DOM pero están ocultas con CSS.
<th style="display: none;">ID Interno</th>
<td style="display: none;">12345</td>
O mediante clases:
.hidden-column { display: none; }
Por qué los sitios hacen esto: Diseño responsivo (ocultar columnas en pantallas chicas), datos internos para JavaScript, divulgación progresiva.
Cómo detectarlo: Abre DevTools, inspecciona la tabla, busca celdas con display: none o visibility: hidden.
2. Atributos Data
HTML5 permite atributos data-* personalizados en cualquier elemento. Las tablas los usan para almacenar metadatos a los que JavaScript accede pero los usuarios no ven.
<tr data-id="12345" data-category="electronics" data-stock="47">
<td>Laptop</td>
<td>$999</td>
</tr>
La tabla visible muestra "Laptop" y "$999". Pero la fila tiene tres datos extra.
Atributos data comunes:
-
data-id— identificador interno -
data-sort-value— valor numérico para ordenar (cuando se muestra "Ene 2024" pero el orden necesita 202401) -
data-raw— valor sin formato (cuando se muestra "$1.2M" pero el dato es 1200000) -
data-href— URL del enlace
3. Atributos Title y Tooltip
El atributo title proporciona texto emergente que suele contener información adicional.
<td title="Actualizado: 2024-01-15 14:32:00 UTC">15 Ene</td>
La celda muestra "15 Ene". La marca de tiempo completa está en el tooltip.
4. Filas Colapsadas/Expandibles
Las tablas con funcionalidad drill-down ocultan filas de detalle hasta que se hace clic.
<tr class="parent-row">
<td>Categoría A</td>
<td>$50.000</td>
</tr>
<tr class="child-row" style="display: none;">
<td>— Subcategoría A1</td>
<td>$30.000</td>
</tr>
<tr class="child-row" style="display: none;">
<td>— Subcategoría A2</td>
<td>$20.000</td>
</tr>
Los datos existen. Simplemente no están expandidos.
5. Contenido con Carga Diferida (Lazy Load)
Algunas tablas muestran un subconjunto y cargan más mediante JavaScript al hacer scroll o clic en "Cargar Más".
<table id="results">
<!-- Primeras 20 filas renderizadas -->
</table>
<button onclick="loadMore()">Mostrar Más Resultados</button>
El resto de los datos no están en el DOM hasta que activas la carga.
Extrayendo Datos Ocultos
Extrayendo Columnas Ocultas con CSS
Con JavaScript (en la consola del navegador):
// Remover display:none de todas las celdas
document.querySelectorAll('td, th').forEach(el => {
el.style.display = '';
});
Ahora exportá normalmente — las columnas son visibles.
Con Python + BeautifulSoup:
BeautifulSoup ignora CSS. Extrae todos los elementos sin importar su visibilidad.
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
table = soup.find('table')
for row in table.find_all('tr'):
cells = [td.get_text(strip=True) for td in row.find_all(['td', 'th'])]
print(cells) # Incluye columnas ocultas
Extrayendo Atributos Data
Enfoque con JavaScript:
const rows = document.querySelectorAll('table tr');
const data = [];
rows.forEach(row => {
const rowData = {
// Texto visible
cells: Array.from(row.querySelectorAll('td')).map(td => td.textContent),
// Atributos data
id: row.dataset.id,
category: row.dataset.category,
stock: row.dataset.stock
};
data.push(rowData);
});
console.log(JSON.stringify(data, null, 2));
Enfoque con Python:
for row in table.find_all('tr'):
# Obtener atributos data
attrs = {k: v for k, v in row.attrs.items() if k.startswith('data-')}
# Obtener texto de las celdas
cells = [td.get_text(strip=True) for td in row.find_all('td')]
print(f"Data: {attrs}, Celdas: {cells}")
Extrayendo Atributos Title
const cells = document.querySelectorAll('table td');
cells.forEach(cell => {
if (cell.title) {
console.log(`Visible: ${cell.textContent}, Completo: ${cell.title}`);
}
});
Expandiendo Filas Colapsadas
Opción 1: Clic en todos los expansores
// Buscar y hacer clic en todos los botones de expansión
document.querySelectorAll('.expand-btn, .toggle-row').forEach(btn => {
btn.click();
});
// Esperar a que el DOM se actualice, luego exportar
setTimeout(() => {
// Lógica de exportación aquí
}, 1000);
Opción 2: Remover la clase hidden
document.querySelectorAll('.child-row, .detail-row').forEach(row => {
row.style.display = '';
row.classList.remove('hidden', 'collapsed');
});
Activando Lazy Load
Esto es más complicado — necesitas simular la acción que dispara la carga.
// Scroll al final para activar scroll infinito
window.scrollTo(0, document.body.scrollHeight);
// O hacer clic en "Cargar Más" repetidamente
const loadMore = document.querySelector('.load-more-btn');
while (loadMore && !loadMore.disabled) {
loadMore.click();
await new Promise(r => setTimeout(r, 500)); // Esperar la carga
}
Ejemplo Real: Valores de Ordenamiento
Las tablas de estadísticas deportivas suelen mostrar números formateados pero ordenar por valores crudos.
<td data-sort="1234567">1.23M</td>
<td data-sort="20240115">15 Ene, 2024</td>
<td data-sort="0.347">34.7%</td>
Si solo extraes el texto visible, obtienes cadenas formateadas que no se pueden ordenar ni calcular correctamente.
Extracción con ambos valores:
const cells = document.querySelectorAll('table td');
const data = Array.from(cells).map(cell => ({
display: cell.textContent.trim(),
sortValue: cell.dataset.sort || cell.textContent.trim()
}));
Cuándo las Extensiones del Navegador Ayudan
Las buenas herramientas de exportación de tablas manejan algo de esto automáticamente:
- Las columnas ocultas con CSS se pueden incluir mediante opciones
- Los atributos data se pueden extraer como columnas adicionales
- La normalización de números puede parsear "$1.23M" a 1230000
HTML Table Exporter extrae contenido visible con manejo adecuado de celdas combinadas y formato. Para necesidades de extracción más complejas sin código, consulta nuestra guía sobre cómo hacer scraping de tablas sin programar.
Para atributos data y contenido profundamente oculto, puede que necesites los enfoques con JavaScript mencionados arriba.
El Flujo de Inspección
Antes de extraer cualquier tabla:
- Abrí DevTools (F12)
- Inspeccioná el elemento tabla
-
Busca:
-
display: noneen columnas - Atributos
data-*en filas/celdas - Atributos
titlecon info extra - Filas hijas ocultas
- Botones "Cargar más"
-
- Decide: ¿Los datos visibles son suficientes, o necesitas los datos ocultos?
La mayoría de las veces, los datos visibles son suficientes. Pero cuando no lo son, saber cómo encontrar y extraer datos ocultos marca la diferencia.
Resumen
Las tablas HTML pueden contener múltiples capas de datos:
| Capa | Cómo Acceder |
|---|---|
| Texto visible | Exportación estándar |
| Columnas ocultas con CSS | Remover display:none o usar BeautifulSoup |
| Atributos data | JavaScript dataset o Python attrs |
| Title/tooltips | Extraer atributo title |
| Filas colapsadas | Expandir o remover clase hidden |
| Carga diferida | Activar la carga primero |
Los datos generalmente están ahí. Solo necesitas saber dónde buscar.
¿Necesitas exportar los datos que puedes ver? Conoce más en gauchogrid.com/es/html-table-exporter o prueba HTML Table Exporter gratis en la Chrome Web Store.
Top comments (0)