2015-06-24 5 views
3

Я новичок в мир HTML выскабливания, и я с трудом вытягивать в пунктах под определенными заголовками, используя rvest в R.Использовать rvest для очистки всех p после h? (Или другой пакет 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> Оценка < h3> Использование rvest или какого-либо другого R-скребкового пакета?

ответ

8

Я расширил это только для демонстрационных целей. Вы должны иметь возможность применить его к исходному коду. На самом деле не рекомендуется переписывать имена в пространствах имен, которые вы используете. Также обратите внимание, что я использую последнюю версию (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;"> в качестве маркера, чтобы остановить тоже. Вы должны проверить xml2's as_list, чтобы помочь.

+0

Thanks @hrbrmstr. Все это работает, за исключением того, что я получаю сообщение об ошибке, если я использую 'read_html()' вместо использования 'html()'. Когда я использую 'read_html()' и продолжаю запускать 'html_nodes()', я получаю ** Ошибка в UseMethod ("html_nodes"): не применимый метод для 'html_nodes', примененный к объекту класса "c ('xml_document', 'xml_node') "**. Когда я переключился на использование 'html()' все работало нормально ... Я обновил мою версию R и переустановил пакеты, поэтому не уверен, что происходит с 'read_html()'. – Adam

+1

Я использую версию из github (которую я должен был запомнить и отметить в сообщении). Утечка идет! Рад, что это работает для вас. – hrbrmstr