XML पैकेज का उपयोग करके आर टेबल को आर डेटा फ्रेम में स्क्रैप करना


153

XML पैकेज का उपयोग करके मैं html तालिकाओं को कैसे परिमार्जन करूं?

उदाहरण के लिए, ब्राज़ीलियाई फुटबॉल टीम के इस विकिपीडिया पृष्ठ को लें । मैं इसे आर में पढ़ना चाहता हूं और "फीफा मान्यता प्राप्त टीमों के खिलाफ ब्राजील द्वारा खेले गए सभी मैचों की सूची" प्राप्त करना चाहता हूं। मैं यह कैसे कर सकता हूँ?


11
Xpath

जवाबों:


144

… या छोटी कोशिश:

library(XML)
library(RCurl)
library(rlist)
theurl <- getURL("https://en.wikipedia.org/wiki/Brazil_national_football_team",.opts = list(ssl.verifypeer = FALSE) )
tables <- readHTMLTable(theurl)
tables <- list.clean(tables, fun = is.null, recursive = FALSE)
n.rows <- unlist(lapply(tables, function(t) dim(t)[1]))

उठाया तालिका पृष्ठ पर सबसे लंबी है

tables[[which.max(n.rows)]]

ReadHTMLTable मदद HTMLPREse (), getNodeSet (), textConnection () और read.table ()
डेव एक्स

48
library(RCurl)
library(XML)

# Download page using RCurl
# You may need to set proxy details, etc.,  in the call to getURL
theurl <- "http://en.wikipedia.org/wiki/Brazil_national_football_team"
webpage <- getURL(theurl)
# Process escape characters
webpage <- readLines(tc <- textConnection(webpage)); close(tc)

# Parse the html tree, ignoring errors on the page
pagetree <- htmlTreeParse(webpage, error=function(...){})

# Navigate your way through the tree. It may be possible to do this more efficiently using getNodeSet
body <- pagetree$children$html$children$body 
divbodyContent <- body$children$div$children[[1]]$children$div$children[[4]]
tables <- divbodyContent$children[names(divbodyContent)=="table"]

#In this case, the required table is the only one with class "wikitable sortable"  
tableclasses <- sapply(tables, function(x) x$attributes["class"])
thetable  <- tables[which(tableclasses=="wikitable sortable")]$table

#Get columns headers
headers <- thetable$children[[1]]$children
columnnames <- unname(sapply(headers, function(x) x$children$text$value))

# Get rows from table
content <- c()
for(i in 2:length(thetable$children))
{
   tablerow <- thetable$children[[i]]$children
   opponent <- tablerow[[1]]$children[[2]]$children$text$value
   others <- unname(sapply(tablerow[-1], function(x) x$children$text$value)) 
   content <- rbind(content, c(opponent, others))
}

# Convert to data frame
colnames(content) <- columnnames
as.data.frame(content)

जोड़ने के लिए संपादित:

नमूना उत्पादन

                     Opponent Played Won Drawn Lost Goals for Goals against  % Won
    1               Argentina     94  36    24   34       148           150  38.3%
    2                Paraguay     72  44    17   11       160            61  61.1%
    3                 Uruguay     72  33    19   20       127            93  45.8%
    ...

7
किसी और के लिए जो इस पद को पाने के लिए काफी भाग्यशाली है, यह स्क्रिप्ट संभवतः तब तक निष्पादित नहीं होगी जब तक कि उपयोगकर्ता अपनी "उपयोगकर्ता-एजेंट" जानकारी नहीं जोड़ता है, जैसा कि इस अन्य सहायक पोस्ट में वर्णित है: stackoverflow.com/questions/9056705/…
रग्बी

26

Xpath का उपयोग कर एक अन्य विकल्प।

library(RCurl)
library(XML)

theurl <- "http://en.wikipedia.org/wiki/Brazil_national_football_team"
webpage <- getURL(theurl)
webpage <- readLines(tc <- textConnection(webpage)); close(tc)

pagetree <- htmlTreeParse(webpage, error=function(...){}, useInternalNodes = TRUE)

# Extract table header and contents
tablehead <- xpathSApply(pagetree, "//*/table[@class='wikitable sortable']/tr/th", xmlValue)
results <- xpathSApply(pagetree, "//*/table[@class='wikitable sortable']/tr/td", xmlValue)

# Convert character vector to dataframe
content <- as.data.frame(matrix(results, ncol = 8, byrow = TRUE))

# Clean up the results
content[,1] <- gsub(" ", "", content[,1])
tablehead <- gsub(" ", "", tablehead)
names(content) <- tablehead

इस परिणाम का उत्पादन करता है

> head(content)
   Opponent Played Won Drawn Lost Goals for Goals against % Won
1 Argentina     94  36    24   34       148           150 38.3%
2  Paraguay     72  44    17   11       160            61 61.1%
3   Uruguay     72  33    19   20       127            93 45.8%
4     Chile     64  45    12    7       147            53 70.3%
5      Peru     39  27     9    3        83            27 69.2%
6    Mexico     36  21     6    9        69            34 58.3%

Xpath का उपयोग करने पर उत्कृष्ट कॉल। माइनर पॉइंट: आप // / / से // को बदलकर पथ तर्क को थोड़ा सरल कर सकते हैं, उदाहरण के लिए "// तालिका [@ वर्ग = 'विकिटेबल सॉर्टेबल'] / tr / th"
रिची कॉटन

मुझे एक त्रुटि मिलती है "लिपियों को संपर्क जानकारी के साथ एक सूचनात्मक उपयोगकर्ता-एजेंट स्ट्रिंग का उपयोग करना चाहिए, या उन्हें बिना सूचना के आईपी-अवरुद्ध किया जा सकता है।" [२] "क्या इस तरीके को लागू करने के लिए कोई रास्ता नहीं है?
१y

2
विकल्प (RCurlOptions = सूची (useragent = "zzzz"))। अन्य विकल्पों और चर्चा के लिए omegahat.org/RCurl/FAQ.html अनुभाग "रनटाइम" भी देखें ।
learnr

25

rvestके साथ-साथ xml2एचटीएमएल वेब पृष्ठों पार्स करने के लिए एक और लोकप्रिय पैकेज है।

library(rvest)
theurl <- "http://en.wikipedia.org/wiki/Brazil_national_football_team"
file<-read_html(theurl)
tables<-html_nodes(file, "table")
table1 <- html_table(tables[4], fill = TRUE)

वाक्यविन्यास xmlपैकेज की तुलना में उपयोग करना आसान है और अधिकांश वेब पृष्ठों के लिए पैकेज उन सभी विकल्पों को प्रदान करता है जिनकी आवश्यकता है।


Read_html मुझे त्रुटि देता है "" फ़ाइल: ///Users/grieb/Auswertungen/tetyana-snp-2016/data/snp-nexus/15/SNP%20nnationation%20Tool.html 'वर्तमान कार्य निर्देशिका में मौजूद नहीं है (') / उपयोगकर्ताओं / grieb / Auswertungen / तेत्याना-एसएनपी-2016 / कोड ')। "
SCS
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.