2013-06-30 4 views
1

Я пытаюсь очистить данные из нескольких URL-адресов сестры для анализа. Предыдущий поток Scraping a web page, links on a page, and forming a table with R был полезным в получении меня на правильном пути со следующим сценарием:Скребок связанных страниц в R

rm(list=ls()) 
library(XML) 
library(RCurl) 

#=======2013======================================================================== 
url2013 = 'http://www.who.int/csr/don/archive/year/2013/en/index.html' 
doc <- htmlParse(url2013) 
dummy2013 <- data.frame(
    dates = xpathSApply(doc, '//*[@class="auto_archive"]/li/a', xmlValue), 
    hrefs = xpathSApply(doc, '//*[@class="auto_archive"]/li/a', xmlGetAttr,'href'), 
    title = xpathSApply(doc, '//*[@class="link_info"]/text()', xmlValue) 
) 

dummy2013$text = unlist(lapply(dummy2013$hrefs,function(x) 
{ 
    url.story <- gsub('/entity','http://www.who.int',x) 
    texts <- xpathSApply(htmlParse(url.story), 
         '//*[@id="primary"]',xmlValue) 
})) 

dummy2013$link <- gsub('/entity','http://www.who.int',dummy2013$hrefs) 

write.csv(dummy2013, "whoDON2013.csv") 

Однако применительно к сестринским URL-адресам, вещи ломаются. Попытка

#=======2011======================================================================== 
url2011 = 'http://www.who.int/csr/don/archive/year/2011/en/index.html' 
doc <- htmlParse(url2011) 
dummy2011 <- data.frame(
    dates = xpathSApply(doc, '//*[@class="auto_archive"]/li/a', xmlValue), 
    hrefs = xpathSApply(doc, '//*[@class="auto_archive"]/li/a', xmlGetAttr,'href'), 
    title = xpathSApply(doc, '//*[@class="link_info"]/text()', xmlValue) 
) 

, например, производит

## Error in data.frame(dates = xpathSApply(doc, "//*[@class=\"auto_archive\"]/li/a", : 
    arguments imply differing number of rows: 59, 60 

Подобные ошибки возникают в http://www.who.int/csr/don/archive/year/2008/en/index.html и http://www.who.int/csr/don/archive/year/2006/en/index.html. Мне не удобно с HTML или XML; любые идеи оценили.

+0

Я предполагаю Ошибка возникает, потому что для даты у вас более одной истории. Сценарий предполагает, что у вас есть одна-одна история отношений-> дата. – agstudy

+1

Возможно, вы могли бы использовать все истории, которые сгруппированы под '

  • ', чтобы поймать эти дубликаты '' link_info''s. – Thomas

    +0

    Спасибо, хотя мне непонятно, что повторяющиеся даты - проблема - тот же скрипт работает в 2012 году (http://www.who.int/csr/don/archive/year/2011/en/index.html), например, и успешно сбрасывает три истории, которые произошли 23 ноября. – user2535366

    ответ

    1

    Вы можете выбрать заголовки первого затем найти HREF, связанные с ними

    require(XML) 
    url2011 = 'http://www.who.int/csr/don/archive/year/2011/en/index.html' 
    doc <- htmlParse(url2011) 
    titleNodes <- getNodeSet(doc, '//*[@class="link_info"]') 
    hrefNodes <- sapply(titleNodes, getNodeSet, path = './preceding-sibling::a') 
    
    dummy2011 <- data.frame(
        dates = sapply(hrefNodes, xmlValue), 
        hrefs = sapply(hrefNodes, xmlAttrs), 
        title = sapply(titleNodes, xmlValue), 
        stringsAsFactors = FALSE 
    ) 
    

    UPDATE:

    для удаления повторяющихся значений вы можете использовать

    dummy2011 <- dummy2011[!duplicated(dummy2011$hrefs),] 
    
    +0

    Спасибо, я попробую! – user2535366

    +0

    @ пользователь2535366 +1! хорошая идея использовать предыдущее значение, возможно, вы можете добавить длину результата ... – agstudy

    +0

    Последнее решение, конечно, работало лучше всего. Благодаря! – user2535366

    0

    Посмотрев более внимательно на HTML-код, о котором идет речь, я обнаружил некоторые несоответствия, которые привели в действие скрипты, которые я применял. Для записи следующих работ (правда, уродливых и специальные-иш - но он получает работу):

    #=======2011======================================================================== 
    url2011 = 'http://www.who.int/csr/don/archive/year/2011/en/index.html' 
    doc <- htmlParse(url2011) 
    
    dates = xpathSApply(doc, '//*[@class="auto_archive"]/li/a',xmlValue) 
    hrefs = xpathSApply(doc, '//*[@class="auto_archive"]/li/a',xmlGetAttr,'href') 
    title = xpathSApply(doc, '//*[@class="link_info"]/text()' ,xmlValue) 
    title[5] <- "Influenza like illness in the United States of America Revised 7 December 2011" 
    title = title[-6] 
    
    dummy2011 <- data.frame(
        dates, 
        hrefs, 
        title 
    ) 
    

    Спасибо тем, кто прыгнул, чтобы помочь мне увидеть мой путь через это, это гораздо оценили.

    +0

    Я добавил обновление к моему решению, которое отвечает вашим потребностям. – user1609452

    +0

    @ user2535366 Я думаю, что лучше и безопаснее использовать/попробовать user1609452 решение (его последнее редактирование), и, возможно, вы можете принять его решение .. – agstudy

    Смежные вопросы