Использование rvest для возврата потомков таблицы

У меня возникли проблемы с выяснением, почему следующий код не возвращает информацию, указанную в xpath.

Я пытаюсь выбрать данные подсчета, найденные в разделе «Основные вопросы» на странице. Я хотел, чтобы он работал для таблицы первого вопроса, а затем намеревался расширить его, чтобы делать то же самое для каждого вопроса/таблицы на странице. К сожалению, я могу заставить его вытащить интересующий меня раздел таблицы. Я полагаю, что ответ включает в себя указание дочерних элементов интересующего меня узла ‹ tr >, то есть несколько тегов ‹ td >, но мои попытки сделать это продолжать терпеть неудачу. Может ли кто-нибудь помочь мне указать интересующую меня часть таблицы? (Бонусные баллы, если это можно сделать для всех десяти столов на странице!)

 library(rvest)

 detailed <- html("https://www.deakin.edu.au/evaluate/results/old/detail-rep.php?schedule_select=1301&faculty_select=01&school_select=0104&unit_select=MIS202&location_select=B")

 q1 <- detailed %>%
 html_nodes(xpath='//*[@id="main"]/div/div/form/fieldset[2]/table[1]/tbody/tr/td[2]/div/table/tbody/tr[5]') %>%
 html_table(header = TRUE, fill=TRUE)

Когда я иду к таблице предков, она вытаскивает информацию, но она чрезвычайно беспорядочна и ее трудно интерпретировать. Когда я пытаюсь указать элементы в этой таблице, я не могу извлечь информацию. Кто-нибудь может мне объяснить, почему потомки table[1] не извлекаются? Вот код для вытягивания table[1]:

 q1 <- detailed %>%
 html_nodes(xpath='//*[@id="main"]/div/div/form/fieldset[2]/table[1]') %>%
 html_table(header = TRUE, fill = TRUE)

person Adam    schedule 25.06.2015    source источник
comment
Каков именно желаемый результат здесь? Функция html_table предполагает, что вы передаете узел table. Если вы начнете выбирать элементы глубже в таблице, это не сработает.   -  person MrFlick    schedule 25.06.2015


Ответы (1)


Это приведет вас туда, где вы должны быть?

allqs <- detailed %>%
  html_nodes(css = ".result center") %>%
  html_text()


t(matrix(as.numeric(allqs), 5, 10, dimnames = list(c("Strongly Disagree", "Disagree", "Neutral", "Agree", "Strongly Agree"), 
                                    paste0("Q", 1:10))))

Который дает:

    Strongly Disagree Disagree Neutral Agree Strongly Agree
Q1                  0        4       4     9              1
Q2                  1        2       2    11              2
Q3                  0        0       2    11              5
Q4                  1        3       2     9              3
Q5                  0        3       4    10              1
Q6                  0        1       5     7              2
Q7                  0        3       6     6              3
Q8                  1        0       2     7              8
Q9                  0        0       5     7              5
Q10                 0        1       4     7              5  
person 27 ϕ 9    schedule 25.06.2015
comment
Это отлично работает, спасибо @JayBlack. Что бы вы сказали, это лучший способ узнать, что указывать в функции html_nodes()? Я пробовал xpath, но вы использовали css, что указывает на то, что css - это путь? Моя самая большая проблема, вероятно, в том, что у меня нет опыта работы с html... Еще раз спасибо - person Adam; 25.06.2015
comment
Если вы еще этого не сделали, прочтите следующую виньетку в документации rvest — она значительно упрощает процесс выбора правильных тегов для парсинга данных. cran.r-project.org/web/packages/rvest/ виньетки/ - person 27 ϕ 9; 25.06.2015