Como pegar elemento no HTML que esteja antes de determinada classe?

Boa noite, pessoal. Tudo bem?

Eu estou fazendo uma raspagem e estou com dificuldade de pegar o elemento da tag “th” que vem antes do outro elemento “th” que contém a classe “type2”. Eu prefiro pegar identificando que ele é o elemento “th” antes do “th” com classe “type2” porque o meu HTML tem muitos “th” e essa foi a única diferença que eu achei entre as tabelas.

Usando rvest ou xml2, eu consigo pegar esse parente?

Obrigada!

	<tr>
		<th class="array">texto_que_eu_quero_pegar</th>
		<td class="array">
			<table>
				<thead>
					<tr>
						<th class="string type2">name</th>
						<th class="array type2">answers</th>
					</tr>
				</thead>

Gabriela, devo dizer que essa parece uma extração meio peculiar. Não existe outra maneira de achar esses elementos? De qualquer forma, acho que o código abaixo resolve o problema:

library(magrittr)

html <- '
<tr>
<th class="array">texto_que_eu_quero_pegar</th>
<td class="array">
<table>
<thead>
<tr>
<th class="string type2">name</th>
<th class="array type2">answers</th>
</tr>
</thead>
'

html %>%
  xml2::read_html() %>%
  xml2::xml_find_all("//th[contains(@class, 'type2')]/preceding::th[not(contains(@class, 'type2'))]")
#> {xml_nodeset (1)}
#> [1] <th class="array">texto_que_eu_quero_pegar</th>

Created on 2020-06-17 by the reprex package (v0.3.0)

Oi, Caio. Obrigada pela resposta!

Como aqui não tinha rolado, eu cheguei a postar no Stackoverflow. A solução por lá foi parecida com a sua. Infelizmente o HTML é muito pobre mesmo e são muitas tabelas (sendo que eu só quero pegar determinado tipo de tabela, e não todas). Essa foi a única forma que identifiquei para pegar esse texto.

1 curtida