1. Reglas básicas de la navegación HTML

En este capítulo analizaremos algunas reglas de navegación en HTML y cómo scrapear una tabla.

  • HTML funciona como un árbol: Dada su naturaleza jerárquica, la forma en que se ubican los datos dentro del código HTML, es en la de un árbol invertido. El nodo raíz de este árbol siempre es la etiqueta HTML y de allí saldran ramas que nos dirigen a otros nodos, conocidos en HTML como hijos o children.

  • Las etiquetas que se encuentran al mismo nivel y que son hijas de la misma etiqueta son parientes o siblings.
  • El hijo de la etiqueta TITLE es un texto: Google. Esta se denomina como hoja, nodo de text o leaf, dado que no es etiqueta y tiene texto. STYLE es técnicamente su hermana, pero no es una hoja, dado que dentro de sí tiene etiquetas.

3. Extracción de tablas con rvest

Hasta ahora sabemos cómo obtener la gran mayoría de elementos que se encuentran en un documento HTML. Así, veremos a continuación un caso especial: tablas.

En su forma más sencilla, una tabla consiste de tres etiquetas HTML distintas: table, tr y td. La etiqueta table designa una tabla, la etiqueta tr designa filas y encierras varias etiquetas td, las cuales designan celdas. Normalmente el número de td dentro de las tr debe ser el mismo; sin embargo, puede utilizarse el atributo colspan en las etiquetas td, permitiendo que una celda se extienda por varias columnas.

Como se puede notar en la gráfica, existen varias otras etiquetas que se pueden utilizar para estructurar una tabla, tal como la etiqueta th, la cual nos permite colocar una fila como encabezado. Tablas que tienen esta fila son más fáciles de scrapear.

Para scrapear una tabla usando rvest, usaremos la función html_table (apoyándonos en la herramienta inspeccionar), tomando como ejemplo la página de wikipedia que nos muestra la discografía de la banda de rock alternativo Muse:

Como se puede notar, esta función transforma a los datos en un tibble (objeto que almacena una tabla de datos, propia del tidyverse). Por otro lado, dicha función tendrá un mejor resultado a medida que mejor estructurados estén los datos. La función html_table tiene los argumentos header y fill que nos sirven para especificar que la primera fila es un encabezado (si no existen etiquetas th) y para rellenar celdas vacías.

En el siguiente capítulo veremos los tipos de selectores existentes y algunas de sus utilidades.

LS0tDQp0aXRsZTogIldlYiBTY3JhcHBpbmcgY29uIFIiDQpzdWJ0aXRsZTogJ0NhcMOtdHVsbyAzOiBOYXZlZ2FyIEhUTUwnDQphdXRob3I6IEh1Z28gUG9ycmFzDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOg0KICAgIGNzczogRXN0aWxvcy5jc3MNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDINCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQpiaWJsaW9ncmFwaHk6IEJpYmxpb2dyYWZpYS5iaWINCmNzbDogY2VwYWwueG1sDQotLS0NCg0KIyAqKjEuIFJlZ2xhcyBiw6FzaWNhcyBkZSBsYSBuYXZlZ2FjacOzbiBIVE1MKioNCg0KIVtdKGh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9wcm94eS9lWnozS1hMVTVuMXVBTkY3dGJpQV9LR1ZEV25QM3RUY1E1QWY0U3FqbzlrQm5nNTF0X3g4NVBYTDBlYUNqdEJXcUpnQmVKdGlyUkJZZFpsVFNNeVVUSF92WmljS0cyeTU2NnhCYXRQcFVKSWIzUU81T19MT0lxNFB0VVFPcExmQVdPaE13ekFOQm9zX2VSSTc1dEo4a2tzdjczdHpTQmhtUnZtWmg4T0xVTjBQdVhpWGVGMDBaM3pDS0w4bHA3Z2wwVUhCMHZTbU44MzhieXcteFlCTUtpMHFGeWJaTGcpDQoNCkVuIGVzdGUgY2Fww610dWxvIGFuYWxpemFyZW1vcyBhbGd1bmFzIHJlZ2xhcyBkZSBuYXZlZ2FjacOzbiBlbiBIVE1MIHkgY8OzbW8gc2NyYXBlYXIgdW5hIHRhYmxhLg0KDQorICoqSFRNTCBmdW5jaW9uYSBjb21vIHVuIMOhcmJvbCoqOiBEYWRhIHN1IG5hdHVyYWxlemEgamVyw6FycXVpY2EsIGxhIGZvcm1hIGVuIHF1ZSBzZSB1YmljYW4gbG9zIGRhdG9zIGRlbnRybyBkZWwgY8OzZGlnbyBIVE1MLCBlcyBlbiBsYSBkZSB1biDDoXJib2wgaW52ZXJ0aWRvLiBFbCBub2RvIHJhw616IGRlIGVzdGUgw6FyYm9sIHNpZW1wcmUgZXMgbGEgZXRpcXVldGEgSFRNTCB5IGRlIGFsbMOtIHNhbGRyYW4gcmFtYXMgcXVlIG5vcyBkaXJpZ2VuIGEgb3Ryb3Mgbm9kb3MsIGNvbm9jaWRvcyBlbiBIVE1MIGNvbW8gaGlqb3MgbyAqKmNoaWxkcmVuKiouDQoNCiFbXShodHRwczovL3d3dy5yZXNlYXJjaGdhdGUubmV0L3Byb2ZpbGUvQW50YW5hcy1DZW55cy9wdWJsaWNhdGlvbi8yNjY2MDk2MDkvZmlndXJlL2ZpZzMvQVM6NjY4OTE1NzMwNDk3NTM5QDE1MzY0OTMzNDYyMzAvSFRNTC1zb3VyY2UtY29kZS1vbi1sZWZ0LXNob3duLWFzLWEtdHJlZS1zdHJ1Y3R1cmUtb24tcmlnaHQucG5nKQ0KDQorIExhcyBldGlxdWV0YXMgcXVlIHNlIGVuY3VlbnRyYW4gYWwgbWlzbW8gbml2ZWwgeSBxdWUgc29uIGhpamFzIGRlIGxhIG1pc21hIGV0aXF1ZXRhIHNvbiBwYXJpZW50ZXMgbyAqKnNpYmxpbmdzKiouDQorIEVsIGhpam8gZGUgbGEgZXRpcXVldGEgVElUTEUgZXMgdW4gdGV4dG86IEdvb2dsZS4gRXN0YSBzZSBkZW5vbWluYSBjb21vIGhvamEsICoqbm9kbyBkZSB0ZXh0KiogbyAqKmxlYWYqKiwgZGFkbyBxdWUgbm8gZXMgZXRpcXVldGEgeSB0aWVuZSB0ZXh0by4gU1RZTEUgZXMgdMOpY25pY2FtZW50ZSBzdSBoZXJtYW5hLCBwZXJvIG5vIGVzIHVuYSBob2phLCBkYWRvIHF1ZSBkZW50cm8gZGUgc8OtIHRpZW5lIGV0aXF1ZXRhcy4NCg0KIyAqKjIuIE5hdmVnYXIgbGEgZXN0cnVjdHVyYSBIVE1MIGNvbiBydmVzdCoqDQoNCkV4aXN0ZW4gdmFyaWFzIGZ1bmNpb25lcyBkZSBydmVzdCBwYXJhIG5hdmVnYXIgc29icmUgSFRNTC4gVmVhbW9zIGFsZ3VuYXMgZGUgZWxsYXMgc29icmUgZWwgZWplbXBsbyBkZSBsYSBjbGFzZSBwYXNhZGEuDQoNCmBgYHtyfQ0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KdXJsIDwtICJodHRwczovL3d3dy55b3JrLmFjLnVrL3RlYWNoaW5nL2N3cy93d3Mvd2VicGFnZTEuaHRtbCINCmh0bWwgPC0gdXJsICU+JSByZWFkX2h0bWwoKQ0KYGBgDQoNCisgVW4gcHJpbWVyIG3DqXRvZG8gZXMgZWwgdXNvIGRlIGxhIGZ1bmNpw7NuICoqaHRtbF9jaGlsZHJlbigpKiosIGxhIGN1YWwgdG9tYSB1biBub2RvIHkgbm9zIGRldnVlbHZlIHN1cyBoaWpvcywgcXVlIHNvbiBkZSBsYSBjbGFzZSB4bWxfbm9kZXNldC4NCg0KYGBge3J9DQpodG1sICU+JSBodG1sX2NoaWxkcmVuKCkNCmBgYA0KU2kgYSBlc3RlIGNvbmp1bnRvIGRlIG5vZG9zIGludGVudGFtb3MgY29udmVydGlybG9zIGF1dG9tw6F0aWNhbWVudGUgYSB0ZXh0bywgb2J0ZW5kcmVtb3MgZWwgc2lndWllbnRlIHJlc3VsdGFkby4NCg0KYGBge3J9DQpodG1sICU+JSBodG1sX2NoaWxkcmVuKCkgJT4lIGh0bWxfdGV4dCgpDQpgYGANCg0KQ29tbyBzZSBwdWVkZSBub3RhciwgYWwgdXNhciAqKmh0bWxfdGV4dCoqIHNlIG9idGllbmUgZWwgdGV4dG8gZGUgdG9kYXMgbGFzIGV0aXF1ZXRhcyBlbiBlbCBjb25qdW50byBkZSBub2RvcyB1dGlsaXphZG8uDQoNCisgT3RyYSBmb3JtYSBkZSBuYXZlZ2FyIGVzIGVsIHVzbyBkZSAqKnNlbGVjdG9yZXMqKiBhIHRyYXbDqXMgZGUgbGFzIGZ1bmNpb25lcyAqKmh0bWxfbm9kZXMqKiB5ICoqaHRtbF9ub2RlKiouIE1pZW50cmFzICoqaHRtbF9ub2RlcyoqIGRldnVlbHZlIHRvZG9zIGxvcyBub2RvcyBkZWwgc2VsZWN0b3IgZXNjb2dpZG8sICoqaHRtbF9ub2RlKiogZGV2dWVsdmUgc29sbyBlbCBwcmltZXJvIHF1ZSBlbmN1ZW50cmUuIEFzw60sIGVsIGFyZ3VtZW50byBxdWUgbmVjZXNpdGFuIGVzdGFzIGZ1bmNpb25lcyBwYXJhIHJlYWxpemFyIHN1IHRyYWJham8gZXMgdW4gKipzZWxlY3RvcioqLiBVbiBzZWxlY3RvciBubyBlcyBtw6FzIHF1ZSB1bmEgKipjYWRlbmEgZGUgdGV4dG8qKiBxdWUgKiplc3BlY2lmaWNhIHVuIGNhbWlubyBxdWUgc2UgZGViZSByZWNvcnJlciBlbiBlbCDDoXJib2wgSFRNTCoqIHBhcmEgbGxlZ2FyIGFsIG9iamV0byBxdWUgZXN0YW1vcyBidXNjYW5kby4gQ2FiZSBub3RhciBxdWUgZXN0b3Mgc2VsZWN0b3JlcyBzaWd1ZW4gdW5hICoqc2ludGF4aXMgZXNwZWPDrWZpY2EqKi4gSW50ZW50ZW1vcyBvYnRlbmVyIHNvbG8gZWwgdGV4dG8gZGUgbG9zIG5vZG9zICoqcCoqIChww6FycmFmb3MpLg0KDQpgYGB7cn0NCmh0bWwgJT4lIGh0bWxfbm9kZXMoInAiKSAlPiUgaHRtbF90ZXh0KCkNCmBgYA0KDQpOb3RlbW9zIHF1ZSBhbCB1c2FyIHNvbG8gKipwKiosIHNlIG9idHV2aWVyb24gdG9kb3MgbG9zIGVsZW1lbnRvcyBkZSBlc3RlIHRpcG8gZW4gdG9kbyBlbCBkb2N1bWVudG8sIHBhcmEgbmF2ZWdhciBhIHVuIG5vZG8gZXNwZWPDrWZpY28sIHRlbmRyZW1vcyBxdWUgZGV0YWxsYXIgbcOhcyBlbCBzZWxlY3RvciwgbG8gY3VhbCBsbyBwb2RlbW9zIGxvZ3JhciBhIHRyYXbDqXMgZGUgbGEgb3BjacOzbiAqKmluc3BlY2Npb25hcioqIHF1ZSB0aWVuZW4gY2FzaSB0b2RvcyBsb3MgbmF2ZWdhZG9yZXMgZXhpc3RlbnRlcywgbyB0cmF2w6lzIGRlIGV4dGVuc2lvbmVzIGNvbW8gKipTZWxlY3RvckdhZGdldCoqIGVuIEdvb2dsZSBDaHJvbWUuDQoNCisgRmluYWxtZW50ZSwgdW5hIHZleiBxdWUgbmF2ZWd1ZW1vcyBhIGxvcyBzZWxlY3RvcmVzIGRlc2VhZG9zLCBwb2RlbW9zIG9idGVuZXIgYXRyaWJ1dG9zIGVzcGVjw61maWNvcyBkZSBlbGxvcywgY29tbyBoaXBlcnbDrW5jdWxvcyBhIHRyYXbDqXMgZGUgbGEgZnVuY2nDs24gKipodG1sX2F0dHIqKi4gRXN0YSBuZWNlc2l0YSBjb21vIGFyZ3VtZW50byBlbCBhdHJpYnV0byBxdWUgZGVzZWFtb3MgZXh0cmFlci4gU2kgdXNhbW9zIGxhIGZ1bmNpw7NuICoqaHRtbF9hdHRycyoqLCBlc3RhIG5vcyBkZXZvbHZlcsOhIHRvZG9zIGxvcyBhdHJpYnV0b3MgZGVsIG5vZG8gc2VsZWNjaW9uYWRvIGNvbW8gdW4gdmVjdG9yLiANCg0KYGBge3J9DQpodG1sICU+JSBodG1sX25vZGVzKCJ0YWJsZSBwIikgJT4lIHBsdWNrKDE1KSAlPiUgaHRtbF9ub2RlKCJhIikgJT4lIGh0bWxfYXR0cnMoKQ0KYGBgDQoNCmBgYHtyfQ0KaHRtbCAlPiUgaHRtbF9ub2RlcygidGFibGUgcCIpICU+JSBwbHVjaygxNSkgJT4lIGh0bWxfbm9kZSgiYSIpICU+JSBodG1sX2F0dHIoImhyZWYiKQ0KYGBgDQoNCiMgKiozLiBFeHRyYWNjacOzbiBkZSB0YWJsYXMgY29uIHJ2ZXN0KioNCg0KIVtdKGh0dHBzOi8vY2RuLnR0Yy5pby9pL2ZpdC8xMDM1LzAvc20vMC9wbGFpbi9leHBvc2luZ3RoZWludmlzaWJsZS5vcmcvY2tlZGl0b3JfYXNzZXRzL3BpY3R1cmVzLzY0Ny9jb250ZW50X2NzLXdlYi1zY3JhcGluZy1lbi12MDEtMDEwLWV4cGFuZGVkLXBhbmUucG5nKQ0KDQpIYXN0YSBhaG9yYSBzYWJlbW9zIGPDs21vIG9idGVuZXIgbGEgZ3JhbiBtYXlvcsOtYSBkZSBlbGVtZW50b3MgcXVlIHNlIGVuY3VlbnRyYW4gZW4gdW4gZG9jdW1lbnRvIEhUTUwuIEFzw60sIHZlcmVtb3MgYSBjb250aW51YWNpw7NuIHVuIGNhc28gZXNwZWNpYWw6IHRhYmxhcy4NCg0KRW4gc3UgZm9ybWEgbcOhcyBzZW5jaWxsYSwgdW5hIHRhYmxhIGNvbnNpc3RlIGRlIHRyZXMgZXRpcXVldGFzIEhUTUwgZGlzdGludGFzOiAqKnRhYmxlKiosICoqdHIqKiB5ICoqdGQqKi4gTGEgZXRpcXVldGEgKip0YWJsZSoqIGRlc2lnbmEgdW5hIHRhYmxhLCBsYSBldGlxdWV0YSAqKnRyKiogZGVzaWduYSBmaWxhcyB5IGVuY2llcnJhcyB2YXJpYXMgZXRpcXVldGFzICoqdGQqKiwgbGFzIGN1YWxlcyBkZXNpZ25hbiBjZWxkYXMuIE5vcm1hbG1lbnRlIGVsIG7Dum1lcm8gZGUgKip0ZCoqIGRlbnRybyBkZSBsYXMgKip0cioqIGRlYmUgc2VyIGVsIG1pc21vOyBzaW4gZW1iYXJnbywgcHVlZGUgdXRpbGl6YXJzZSBlbCBhdHJpYnV0byAqKmNvbHNwYW4qKiBlbiBsYXMgZXRpcXVldGFzICoqdGQqKiwgcGVybWl0aWVuZG8gcXVlIHVuYSBjZWxkYSBzZSBleHRpZW5kYSBwb3IgdmFyaWFzIGNvbHVtbmFzLg0KDQohW10oaHR0cHM6Ly9mbGF2aW9jb3Blcy5jb20vaHRtbC10YWJsZXMvbm8tc3R5bGluZy5wbmcpDQoNCkNvbW8gc2UgcHVlZGUgbm90YXIgZW4gbGEgZ3LDoWZpY2EsIGV4aXN0ZW4gdmFyaWFzIG90cmFzIGV0aXF1ZXRhcyBxdWUgc2UgcHVlZGVuIHV0aWxpemFyIHBhcmEgZXN0cnVjdHVyYXIgdW5hIHRhYmxhLCB0YWwgY29tbyBsYSBldGlxdWV0YSAqKnRoKiosIGxhIGN1YWwgbm9zIHBlcm1pdGUgY29sb2NhciB1bmEgZmlsYSBjb21vIGVuY2FiZXphZG8uIFRhYmxhcyBxdWUgdGllbmVuIGVzdGEgZmlsYSBzb24gbcOhcyBmw6FjaWxlcyBkZSBzY3JhcGVhci4NCg0KUGFyYSBzY3JhcGVhciB1bmEgdGFibGEgdXNhbmRvIHJ2ZXN0LCB1c2FyZW1vcyBsYSBmdW5jacOzbiAqKmh0bWxfdGFibGUqKiAoYXBvecOhbmRvbm9zIGVuIGxhIGhlcnJhbWllbnRhIGluc3BlY2Npb25hciksIHRvbWFuZG8gY29tbyBlamVtcGxvIGxhIHDDoWdpbmEgZGUgd2lraXBlZGlhIHF1ZSBub3MgbXVlc3RyYSBsYSBkaXNjb2dyYWbDrWEgZGUgbGEgYmFuZGEgZGUgcm9jayBhbHRlcm5hdGl2byAqKltNdXNlXShodHRwczovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9NdXNlKSoqOg0KDQpgYGB7cn0NCmh0bWwgPC0gcmVhZF9odG1sKCJodHRwczovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9BbmV4bzpEaXNjb2dyYWYlQzMlQURhX2RlX011c2UiKQ0KaHRtbCAlPiUgaHRtbF9ub2RlKCIjbXctY29udGVudC10ZXh0ID4gZGl2Lm13LXBhcnNlci1vdXRwdXQgPiBjZW50ZXI6bnRoLWNoaWxkKDkpID4gdGFibGUiKSAlPiUgaHRtbF90YWJsZSgpDQpgYGANCg0KQ29tbyBzZSBwdWVkZSBub3RhciwgZXN0YSBmdW5jacOzbiB0cmFuc2Zvcm1hIGEgbG9zIGRhdG9zIGVuIHVuIHRpYmJsZSAob2JqZXRvIHF1ZSBhbG1hY2VuYSB1bmEgdGFibGEgZGUgZGF0b3MsIHByb3BpYSBkZWwgdGlkeXZlcnNlKS4gUG9yIG90cm8gbGFkbywgZGljaGEgZnVuY2nDs24gdGVuZHLDoSB1biBtZWpvciByZXN1bHRhZG8gYSBtZWRpZGEgcXVlIG1lam9yIGVzdHJ1Y3R1cmFkb3MgZXN0w6luIGxvcyBkYXRvcy4gTGEgZnVuY2nDs24gKipodG1sX3RhYmxlKiogdGllbmUgbG9zIGFyZ3VtZW50b3MgKipoZWFkZXIqKiB5ICoqZmlsbCoqIHF1ZSBub3Mgc2lydmVuIHBhcmEgZXNwZWNpZmljYXIgcXVlIGxhIHByaW1lcmEgZmlsYSBlcyB1biBlbmNhYmV6YWRvIChzaSBubyBleGlzdGVuIGV0aXF1ZXRhcyAqKnRoKiopIHkgcGFyYSByZWxsZW5hciBjZWxkYXMgdmFjw61hcy4NCg0KRW4gZWwgc2lndWllbnRlIGNhcMOtdHVsbyB2ZXJlbW9zIGxvcyB0aXBvcyBkZSBzZWxlY3RvcmVzIGV4aXN0ZW50ZXMgeSBhbGd1bmFzIGRlIHN1cyB1dGlsaWRhZGVzLg0KDQo=