2017-11-22 1 views
0

Ich versuche Daten von jedem Team, das mindestens einmal in den letzten 30 Jahren an der Weltmeisterschaft teilgenommen hat, zu kratzen.R: Probleme beim Schaben von Tischen von FIFA mit Hilfe von

Mein Wissen darüber, wie man das R-Paket zu verwenden, um Tabellen und was nicht aus dem Internet zu kratzen, ist im besten Fall rudimentär.

Derzeit mein Code sieht aus wie

library(rvest) 
library(dplyr) 
fifadata <- read_html("http://www.fifa.com/fifa-tournaments/teams/association=BRA/index.html") 
fifa_data_html <- 
    html_nodes(fifadata, 
     xpath='/html/body/div[1]/div[5]/div/div[4]/div/div[2]/div/div/div[1]/div/table') %>% 
    html_table(header=FALSE, fill=TRUE) 
fifa_data_html 

Die erste Tabelle auf der Webseite ist es, was ich kratzen wollen, aber wenn ich den obigen Code ausführen, html_nodes() zurückkehrt {xml_nodeset (0)}.

Irgendwelche Eingaben, wie man die Tabelle in Frage richtig schabt, würde sehr geschätzt werden.

+0

Sie versuchen also, den Teil zu extrahieren, in dem Brasilien 2014, Südafrika 2010 aufgeführt ist? – amrrs

+0

Ja, die Gewinne von jedem Turnier zurück bis 1986. – David

Antwort

0

Hier ist etwas. Es ist ein ziemliches Durcheinander:

xp = paste0('//li[@class="tbl-cupname"]/', 
      'div[@class="label-data"]/', 
      'span[@class="text"][text()="FIFA World Cup™"]/../../', 
      'following-sibling::li[@class="tbl-appearances"]/', 
      'div[@class="label-data"]/', 
      'span[@class="text"]') 
fifadata %>% html_nodes(xpath = xp) %>% html_text %>% as.integer 
# [1] 20 

Lassen Sie uns die Logik durchbrechen.

Die naive Abfrage:

fifadata %>% html_nodes(
    xpath = '//li[@class="tbl-appearances"]/div[@class="label-data"]/span' 
) 

Ist ausreichend, um uns die vier Reihen, die Anzahl der Auftritte in jeder der vier Turniere geben auf dieser Seite aufgelistet. Wenn die Webdesigner barmherzig sind, ist dies ausreichend - wählen Sie einfach die erste von jeder Seite aus, die Sie scrappen möchten, und Sie werden haben, wonach Sie suchen.

Dies ist jedoch nicht robust - es liefert falsche Ergebnisse, wenn sich die Zeilenreihenfolge ändert oder wenn die gewünschte Zeile fehlt.

Die gestellte Abfrage erledigt dies.

Zuerst identifizieren wir die Reihen, die mit der FIFA Fussball-Weltmeisterschaft zusammenhängen. Die wesentliche Struktur gibt es:

<li class="tbl-cupname"> 
    <div class="label-data"> 
    <span class="text"> n_appearances </span> 
    </div> 
</li> 

Wir verwenden die class Attribute, da es andere li und div in der Nähe, dass wir ausschließen sicher sein wollen. So können wir die vier Reihen entsprechend den Turnieren (Fußball-Weltmeisterschaft, FIFA Konföderationen-Pokal, die FIFA Frauen-WM und Olympischen Fussballturnier der Frauen) wählen mit:

fifadata %>% html_nodes(xpath = '//li[@class="tbl-cupname"]') 

Beseitigung der drei Turniere, die nicht relevant sind, um Ihre Verfolgung erfordert eine Bedingung auf dem <span> Element, daher auch der Rest des ersten Teils:

xp_part_1 = paste0('//li[@class="tbl-cupname"]/', 
        'div[@class="label-data"]/', 
        'span[@class="text"][text()="FIFA World Cup™"]') 
fifadata %>% html_nodes(xpath = xp_part_1) 

das das Turnier wählt, wollen wir aber die nachfolgendenli die die Nummer enthält des Aussehens. Die Kernstruktur wir berühren hier:

<li class="tbl-cupname"> </li> 
<li class="tbl-appearances"> </li> 

Teil 1 von der XPath uns nach unten zwei Ebenen unterhalb dieser li jedoch navigiert hat, so müssen wir „aufsteigen“, die Knoten mit .. (dies ist genau wie cd .. im Linux-Terminal, um ein Niveau zu steigen, so hoffentlich erinnert das).

Wir verwenden dann die following-sibling Syntax, um Knoten auszuwählen, die auf der gleichen Ebene wie der aktuelle Knoten sind, aber später kommen.

Sobald wir wieder auf der gleichen Ebene wie die li Benennung des Turniers sind, können wir mit der "naiven" Abfrage weitermachen, um die Anzahl der Erscheinungen zu untersuchen.

Verwandte Themen