Html 如何使用相对于标题的rvest刮取wikipedia中的有序和无序列表

Html 如何使用相对于标题的rvest刮取wikipedia中的有序和无序列表,html,r,xml,rvest,Html,R,Xml,Rvest,我想从Wikipdia中收集几个国家的事件,并将每个事件放在一行表中。某个数据可以有一个事件(其中有一个主项目符号)或多个事件(其中有“子项目符号”) 我遇到的问题是如何同时获取有序列表和无序列表,并将它们清晰地分开。下面的代码将抓住“子项目符号”,但不是“主要”项目符号。如果我更改代码以排除/li,那么它将把“子项目符号”放在单个单元格中我想知道是否有办法更容易地将“主要”和“次要要点”分开。 对于包含不同国家/地区事件的页面,html布局似乎略有不同。是否可以基于标头(而不是相对或绝对位置

我想从Wikipdia中收集几个国家的事件,并将每个事件放在一行表中。某个数据可以有一个事件(其中有一个主项目符号)或多个事件(其中有“子项目符号”)

  • 我遇到的问题是如何同时获取有序列表和无序列表,并将它们清晰地分开。下面的代码将抓住“子项目符号”,但不是“主要”项目符号。如果我更改代码以排除
    /li
    ,那么它将把“子项目符号”放在单个单元格中我想知道是否有办法更容易地将“主要”和“次要要点”分开。

  • 对于包含不同国家/地区事件的页面,html布局似乎略有不同。是否可以基于标头(而不是相对或绝对位置)指定xml路径,然后获取之后的元素?不幸的是,由于对html如此陌生,我不太确定如何做到这一点,或者这是否可能是否可以找到标题“每月事件”,找到标题“一月”,然后在表格的单独单元格中获取所有项目符号和子项目符号?

  • 任何帮助都将不胜感激

    谢谢

    # This gets the sub bullet points of the events, but not the main ones 
    page <- xml2::read_html("https://en.wikipedia.org/wiki/2020_in_the_United_States")
    month_data = page %>%
            html_nodes(xpath = "/html/body/div[3]/div[3]/div[5]/div[1]/ul[3]/li") %>% 
            html_text()
    
    #这将获得事件的次要点,但不是主要要点
    页数%
    html_节点(xpath=“/html/body/div[3]/div[3]/div[5]/div[1]/ul[3]/li”)%>%
    html_text()
    
    此网页没有结构,它只是一个长长的标签列表,没有清楚地将不同的部分分开

    这是部分解决方案:

    library(rvest)
    library(xml2)
    library(dplyr)
    
    page <- xml2::read_html("https://en.wikipedia.org/wiki/2020_in_the_United_States")
    lineitems <- page %>% html_nodes(xpath = "//html/body/div[3]/div[3]/div[5]/div[1]/ul[3]/li")
    
    #Count the number of child ul nodes
    subcount <- lineitems %>% html_node("ul") %>% xml_length()
    
    output <- lapply(1:length(subcount), function(i) {
       if(subcount[i] == 0 ){
          out <- lineitems[i]   %>%  html_text()
       }
       else {
          out <-  lineitems[i] %>% html_node("ul") %>% 
                                   html_nodes(xpath=".//li") %>% html_text()
       }
       out
    })
    #name the list items with the data
    names(output) <- lineitems %>% html_node("a") %>% 
                                html_attr("title")
    #a list for each date
    output
    
    库(rvest)
    库(xml2)
    图书馆(dplyr)
    页面%xml_长度()
    产量%
    html_节点(xpath=“../li”)%%>%html_文本()
    }
    出来
    })
    #用数据命名列表项
    名称(输出)%html\U节点(“a”)%%>%
    html_属性(“标题”)
    #每个日期的清单
    输出
    

    我没有时间和耐心来改进这个。根据可用属性而不是特定的html/xml标记选择节点可能会更容易。

    谢谢!没想到会这么难。你的部分解决方案非常有用。