2016-03-01 61 views
5

刮HTML表跨度我使用rvest提取如下页表所示:使用rvest

https://en.wikipedia.org/wiki/List_of_United_States_presidential_elections_by_popular_vote_margin

下面的代码工作:

URL <- 'https://en.wikipedia.org/wiki/List_of_United_States_presidential_elections_by_popular_vote_margin' 
table <- URL %>% 
    read_html %>% 
    html_nodes("table") %>% 
    .[[2]] %>% 
    html_table(trim=TRUE) 

但利润率列总统的名字有一些奇怪的价值。其原因是源代码有以下几点:

<td><span style="display:none">00.001</span>−10.44%</td> 

这样反而让-10.44%我得到00.001â'10.44%

我怎么能解决这个问题?

+2

也许有人可以建立在这得到了整个表...'read_html(”​​的 00.001 -10.44%')%>% html_nodes(xpath =”// td/text()[before-sibling :: span]“)%>%html_text()' – cory

回答

2

一种选择是单独定位并替换问题列。

保证金栏能够与xpath

# get the html 
html <- URL %>% 
    read_html() 

# Example using the first margin column (column # 6) 
html %>% 
    html_nodes(xpath = '//table[2]') %>%  # get table 2 
    html_nodes(xpath = '//td[6]/text()') %>% # get column 6 using text() 
    iconv("UTF-8", "UTF-8")     # to convert "−" to "-" 
# [1] "−10.44%" "−3.00%" "−0.83%" "−0.51%" "0.09%" "0.17%" "0.57%" 
# [8] "0.70%" "1.45%" "2.06%" "2.46%" "3.01%" "3.12%" "3.86%" 
#[15] "4.31%" "4.48%" "4.79%" "5.32%" "5.56%" "6.05%" "6.12%" 
#[22] "6.95%" "7.27%" "7.50%" "7.72%" "8.51%" "8.53%" "9.74%" 
#[29] "9.96%" "10.08%" "10.13%" "10.85%" "11.80%" "12.20%" "12.25%" 
#[36] "14.20%" "14.44%" "15.40%" "17.41%" "17.76%" "17.81%" "18.21%" 
#[43] "18.83%" "22.58%" "23.15%" "24.26%" "25.22%" "26.17%" 

有针对性做其他保证金列相同。我使用iconv−转换为-,因为这是一个编码问题,但您可以使用基于替换的解决方案(例如使用sub)。

要与美国总统的名字目标列,您可以再次使用XPath:

html %>% 
    html_nodes(xpath = '//table[2]') %>% 
    html_nodes(xpath = '//td[3]/a/text()') %>% 
    html_text() 
# [1] "John Quincy Adams"  "Rutherford Hayes"  "Benjamin Harrison"  
# [4] "George W. Bush"   "James Garfield"   "John Kennedy"   
# [7] "Grover Cleveland"  "Richard Nixon"   "James Polk"    
#[10] "Jimmy Carter"   "George W. Bush"   "Grover Cleveland"  
#[13] "Woodrow Wilson"   "Barack Obama"   "William McKinley"  
#[16] "Harry Truman"   "Zachary Taylor"   "Ulysses Grant"   
#[19] "Bill Clinton"   "William Henry Harrison" "William McKinley"  
#[22] "Franklin Pierce"  "Barack Obama"   "Franklin Roosevelt"  
#[25] "George H. W. Bush"  "Bill Clinton"   "William Taft"   
#[28] "Ronald Reagan"   "Franklin Roosevelt"  "Abraham Lincoln"  
#[31] "Abraham Lincoln"  "Dwight Eisenhower"  "Ulysses Grant"   
#[34] "James Buchanan"   "Andrew Jackson"   "Martin Van Buren"  
#[37] "Woodrow Wilson"   "Dwight Eisenhower"  "Herbert Hoover"   
#[40] "Franklin Roosevelt"  "Andrew Jackson"   "Ronald Reagan"   
#[43] "Theodore Roosevelt"  "Lyndon Johnson"   "Richard Nixon"   
#[46] "Franklin Roosevelt"  "Calvin Coolidge"  "Warren Harding"