Как получить элемент HTML, который находится перед определенным классом?

Я соскребаю и не могу получить элемент тега «th», который стоит перед другим элементом «th», содержащим класс «type2». Я предпочитаю брать его, определяя, что это элемент «th» перед «th» с классом «type2», потому что в моем HTML много «th», и это была единственная разница, которую я нашел между таблицами.

Могу ли я получить этого родителя, используя rvest или xml2 (или другой пакет R)? Содержимое, которое я хочу, это "text_that_I_want".

Благодарю вас!

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

person polo    schedule 15.06.2020    source источник
comment
Это исходит с общедоступной веб-страницы?   -  person QHarr    schedule 15.06.2020


Ответы (2)


Формальный и более общий способ навигации по xpath относительно заданного узла — через ancestor preceding-sibling:

read_html(htmldoc) %>% 
html_nodes(xpath = "//th[@class = 'string type2']/ancestor::td/preceding-sibling::th") %>% 
html_text()
#> [1] "text_that_I_want"
person Allan Cameron    schedule 15.06.2020
comment
Хороший! Не знал этого :) - person Dominik S. Meier; 15.06.2020
comment
Интересное решение, но оно не работало должным образом, потому что нужно учитывать класс type2. Если он не учитывает класс type2, он также получит неправильный контент. - person polo; 15.06.2020

Мы можем найти строку «type2» во всех <th>, получить индекс первого вхождения и вычесть 1, чтобы получить нужный индекс:

library(dplyr)
library(rvest)

location <- test%>% 
  html_nodes('th') %>% 
  str_detect("type2")

index_want <- min(which(location == TRUE) - 1)

test%>% 
  html_nodes('th') %>%
  .[[index_want]] %>% 
  html_text()

[1] "text_that_I_want"
person Dominik S. Meier    schedule 15.06.2020