2016-03-01 16 views
5

Używam rvest wyodrębnić tabeli na następnej stronie:Skrobanie tabeli html z zakresu korzystania rvest

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

Poniższy kod działa:

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) 

ale kolumnę marginesów a nazwiska prezydenta mają dziwne wartości. Powodem jest to, że kod źródłowy są następujące:

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

więc zamiast się -10.44% mam 00.001â'10.44%

Jak mogę rozwiązać ten problem?

+2

Może ktoś może opierać się na tym, aby dostać całą tabelę ... 'read_html (” 00.001 -10.44% ')%>% html_nodes (xpath =" // td/text() [previous-sibling :: span] ")%>% html_text()' – cory

Odpowiedz

2

Jedną opcją jest indywidualne ukierunkowanie i zastąpienie kolumn problemów.

Kolumny marginesu może być kierowana z 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%" 

Zrób to samo dla drugiej kolumnie granicznej. Użyłem iconv do konwersji − na -, ponieważ jest to problem związany z kodowaniem, ale zamiast tego można użyć rozwiązania opartego na podstawieniu (np. Za pomocą sub).

Aby kierować kolumnę z nazwami przewodniczący, można ponownie użyć 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"