Используйте rvest, чтобы очистить все p после h? (или другой пакет R)

Я новичок в мире парсинга HTML, и мне трудно вытаскивать абзацы под определенными заголовками, используя rvest в R.

Я хочу собрать информацию с нескольких сайтов, у которых все примерно одинаковы. Все они имеют одинаковые заголовки, но количество абзацев под заголовком может меняться. Мне удалось очистить определенные абзацы под заголовком с помощью следующего кода:

unitCode <- data.frame(unit = c('SLE010', 'SLE115', 'MAA103'))

html <- sapply(unitCode, function(x) paste("http://www.deakin.edu.au/current-students/courses/unit.php?unit=", 
                                          x,
                                          "&return_to=%2Fcurrent-students%2Fcourses%2Fcourse.php%3Fcourse%3DS323%26version%3D3", 
                                          sep = ''))
assessment <- html[3] %>%
              html() %>%
              html_nodes(xpath='//*[@id="main"]/div/div/p[3]') %>%
              html_text()

Элемент xpath вставляется в первый абзац под заголовком оценки. На некоторых страницах есть несколько абзацев под заголовком оценки, которые я могу получить, если изменю переменную xpath, чтобы указать их конкретно, например p [4] или p [5]. К сожалению, я хочу повторить этот процесс на сотнях страниц, поэтому менять xpath каждый раз нецелесообразно, и я даже не знаю, сколько абзацев будет на каждой странице.

Я думаю, что вытащить все ‹p> после интересующего меня заголовка - лучший вариант, учитывая неопределенность в настройке страниц.

Мне было интересно, есть ли способ очистить все ‹p> после‹ h3> Assessment ‹h3>, используя rvest или какой-либо другой пакет для очистки R?


person Adam    schedule 24.06.2015    source источник


Ответы (1)


Я расширил это только для демонстрационных целей. Вы сможете применить его к исходному коду. На самом деле не рекомендуется перезаписывать имена в пространствах имен, которые вы в конечном итоге используете. Также обратите внимание, что я использую последнюю (версию для github / devtools) rvest, которая использует xml2 и не рекомендуется html.

Ключ xpath="//h3[contains(., 'Assessment')]/following-sibling::p", таким образом:

library(rvest)

unitCode <- data.frame(unit = c('SLE010', 'SLE115', 'MAA103'))

sites <- sapply(unitCode, function(x) paste("http://www.deakin.edu.au/current-students/courses/unit.php?unit=", 
                                          x,
                                          "&return_to=%2Fcurrent-students%2Fcourses%2Fcourse.php%3Fcourse%3DS323%26version%3D3", 
                                          sep = ''))

pg <- read_html(sites[1])
pg_2 <- read_html(sites[2])
pg_3 <- read_html(sites[3])

pg %>% html_nodes(xpath="//h3[contains(., 'Assessment')]/following-sibling::p")

## {xml_nodeset (2)}
## [1] <p>This unit is assessed on a pass/fail basis. Multiple-choice on-line test   ...
## [2] <p style="margin-top: 2em;">\n  <a href="/current-students/courses/course.php ...

pg_2 %>% html_nodes(xpath="//h3[contains(., 'Assessment')]/following-sibling::p")

## {xml_nodeset (3)}
## [1] <p>Mid-trimester test 20%, three assignments (3 x 10%) 30%, examination 50%.</p>
## [2] <p>* Rate for all CSP students, except for those who commenced Education and  ...
## [3] <p style="margin-top: 2em;">\n  <a href="/current-students/courses/course.php ...

pg_3 %>% html_nodes(xpath="//h3[contains(., 'Assessment')]/following-sibling::p")

## {xml_nodeset (6)}
## [1] <p>Assessment 1 (Group of 3 students) - Student video presentation (5-7 mins) ...
## [2] <p>Assessment 2 (Group of 3 students) - Business plan (3500-4000 words) - 30% ...
## [3] <p>Examination (2 hours) - 60%</p>
## [4] <p><a href="http://www.deakin.edu.au/glossary?result_1890_result_page=H" targ ...
## [5] <p>* Rate for all CSP students, except for those who commenced Education and  ...
## [6] <p style="margin-top: 2em;">\n  <a href="/current-students/courses/course.php ...

Вы, вероятно, тоже можете использовать этот <p style="margin-top: 2em;"> как маркер, чтобы остановиться. Вам следует проверить as_list xml2, чтобы вам помочь.

person hrbrmstr    schedule 24.06.2015
comment
Спасибо @hrbrmstr. Все это работает, за исключением того, что я получаю сообщение об ошибке, если использую read_html() вместо html(). Когда я использую read_html() и продолжаю запускать html_nodes(), я получаю Ошибка в UseMethod (html_nodes): нет применимого метода для 'html_nodes', примененного к объекту класса c ('xml_document', 'xml_node') . Когда я вернулся к использованию html(), все работало нормально ... Я обновил свою версию R и переустановил пакеты, поэтому не уверен, что происходит с read_html(). - person Adam; 24.06.2015
comment
Я использую версию с github (которую надо было запомнить и отметить в посте). Прекращение поддержки приближается! Однако рад, что это сработало для вас. - person hrbrmstr; 24.06.2015