2016-03-01 21 views
5

Tôi đang sử dụng rvest để trích xuất các bảng trong trang sau đây:Nạo bảng html với khoảng sử dụng rvest

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

Các mã sau hoạt động:

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) 

nhưng cột của lề và tên của tổng thống có một số giá trị kỳ lạ. Lý do là mã nguồn có điều sau đây:

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

nên thay vì nhận được -10,44% tôi nhận được 00.001â'10.44%

Làm thế nào tôi có thể sửa lỗi này?

+2

Có lẽ ai đó có thể xây dựng về vấn đề này để có được toàn bộ bảng ... 'read_html (' 00.001 −10.44% ')%>% html_nodes (xpath =" // td/text() [trước-sibling :: span] ")%>% html_text()' – cory

Trả lời

2

Một tùy chọn là nhắm mục tiêu và thay thế các cột vấn đề riêng lẻ.

Các cột lề có thể được nhắm mục tiêu với 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%" 

Làm tương tự cho các cột lề khác. Tôi đã sử dụng iconv để chuyển đổi − thành - vì đây là sự cố mã hóa nhưng thay vào đó bạn có thể sử dụng giải pháp thay thế (ví dụ: sử dụng sub).

Để nhắm mục tiêu cột với tên tổng thống, bạn có thể sử dụng xpath một lần nữa:

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" 
Các vấn đề liên quan