2016-06-02 9 views
0

In der Webseite gibt es eine Art Tabelle in der Webseite, die mehr als ein Element in einer Zelle haben. Ich kann den Inhalt in der Tabelle mit folgendem Code crawlen, aber ich konnte diese Elemente nicht als ihre Webseitenarchitektur binden. Haben wir einige Methoden, um diese Elemente perfekt zu kombinieren, oder sollten wir eine andere Idee verwenden, um jedes Element zu erhalten?Behalten Sie die Architektur der Tabelle mit mehreren Elementen in einer Zelle beim Crawlen in R

library(XML) 
dataissued <- "http://www.irgrid.ac.cn/handle/1471x/294320/browse?type=dateissued" 
    ec_parsed <- htmlTreeParse(dataissued, encoding = "UTF-8", useInternalNodes = TRUE) 

# gether content in table and build the dataframe 
# title and introduction link of IR resource 
item_title <- xpathSApply(ec_parsed, '//td[@headers="t1"]//a', xmlValue) 
item_hrefs <- xpathSApply(ec_parsed, '//td[@headers="t1"]//a/@href') 
# author and introduction link of IR resource 
auth_name <- xpathSApply(ec_parsed, '//td[@headers="t2"]//a', xmlValue) 
auth_hrefs <- xpathSApply(ec_parsed, '//td[@headers="t2"]//@href') 
# publish date of IR resource 
pub_date <- xpathSApply(ec_parsed, '//td[@headers="t3"]', xmlValue) 
# whole content link of IR resource 
con_link <- xpathSApply(ec_parsed, '//td[@headers="t3"]//a[@href]', xmlValue) 

item_table <- cbind(item_title, item_hrefs, auth_name, auth_hrefs, pub_date, con_link) 
colnames(item_table) <- c("t1", "href1", "t2", "href2", "t3", "t4", "href4") 

Ich habe viele Male versucht, aber noch können sie nicht organisieren, wie es sein sollte, genau wie ein Papier mehrere Autoren haben kann, und alle Autoren und ihre Verbindungen sollten in einer „Reihe“, aber jetzt ein Autor speichern ist in einer Reihe, und der Titel des Papiers wird vollständig wiederverwendet. Das macht das Ergebnis durcheinander.

+0

Ich bekomme 'con_link' leer und einen Fehler in der letzten Zeile versucht 7 Spaltennamen zu Item_Table, die 6 Spalten hat zuweisen. Könnten Sie bitte den Code reparieren? – xxfelixxx

+0

Tut mir leid. Ich hatte erklärt, dass mein Code einige Fehler beim Kombinieren der Daten hat, die er krähte, und ich habe versucht, es zu reparieren, aber nichts funktioniert. Schätzen Sie Ihre Aufmerksamkeit darauf. –

Antwort

0

Dies ist eine Möglichkeit, einen langen Datenrahmen aus der Tabelle zu machen:

library(rvest) 
library(purrr) 
library(tibble) 

pg <- read_html("http://www.irgrid.ac.cn/handle/1471x/294320/browse?type=dateissued") 

# extract the columns 

col1 <- html_nodes(pg, "td[headers='t1']") 
col2 <- html_nodes(pg, "td[headers='t2']") 
col3 <- html_nodes(pg, "td[headers='t3']") 

# this is the way to get the full text column 

col4 <- html_nodes(pg, "td[headers='t3'] + td") 

# now, iterate over the rows; map_df() will bind all our data.frame's together 

map_df(1:legnth(col1), function(i) { 

    # extract the links 

    a1 <- xml_nodes(col1[i], "a") 
    a2 <- xml_nodes(col2[i], "a") 
    a4 <- xml_nodes(col4[i], "a") 

    # put the row into a long data.frame for the row 

    data_frame(  title = html_text(a1, trim=TRUE), 
       title_link = html_attr(a1, "href"), 
        author = html_text(a2, trim=TRUE), 
      author_link = html_attr(a2, "href"), 
       issue_date = html_text(col3[i], trim=TRUE), 
       full_text = html_attr(a4, "href")) 

}) 
+0

Vielen Dank für Ihre Hilfe. Es ist sehr beschämt, dass ich nie das ganze Paket benutzt habe, das du oben im Programm benutzt hast. Und dein ordentlicher Code ist wirklich großartig. Aber ich habe noch zwei Fragen dazu. 1. "map_df" ist eine "Funktion", und nicht nur der damit kombinierte Datenrahmen konnte nicht die übliche Methode zum Aufdecken verwenden, sondern auch der Inhalt in dem Datenrahmen, der in der Konsole von Rstudio wiedergegeben wird, hat Massencode darin. 2. Nach dem Kombinieren dieser Elemente muss die Lesemethode des generierten Datenrahmens geändert werden? –

0

Das größte Problem bei den „rvest“ Paket mit Code ist Chaos. Sogar der Parameter "encoding" wurde im Programm verwendet, das Ergebnis hat immer noch mess code. Aber die Webseitencodierung ist UTF-8. Wie zum Beispiel:

library(rvest) 
pg <- read_html("http://www.irgrid.ac.cn/handle/1471x/294320/browse?type=dateissued", encoding = "UTF-8") 

Für meinen Test soll die beste Leistung „XML“ sein, wenn ich getNodeset Funktion zu verwenden, überhaupt das Ergebnis richtig ist, kein Dreck Code. Allerdings bekomme ich nur den ganzen Knoten und konnte nicht jede Zeile der Tabelle mit ihrer Struktur zusammenbringen.

library(XML) 
pg <- "http://www.irgrid.ac.cn/handle/1471x/294320/browse?type=dateissued" 
pg_tables <- getNodeSet(htmlParse(pg), "//table[@summary='This table browse all dspace content']") 
# gether the node of whole table 
papernode <- getNodeSet(pg_tables[[1]], "//td[@headers='t1']") 
paper_hrefs <- xpathSApply(papernode[[1]], '//a/@href') 
paper_name <- xpathSApply(papernode[[1]], '//a', xmlValue) 
# gether authors in table 
authnode <- getNodeSet(pg_tables[[1]], "//td[@headers='t2']") 
# gether date in table 
datenode <- getNodeSet(pg_tables[[1]], "//td[@headers='t3']") 

Mit diesem Programm könnte ich diese "Knoten" getrennt bekommen. Das Crawlen der Header und ihrer Links scheint jedoch schwieriger zu werden. Weil die Ergebnisklasse von "getNodeSet" nicht gleich "html_nodes" ist. Wie können wir den von "getNodeSet" generierten Datenrahmen automatisch lesen und den Header und deren Links exakt aus diesen Knoten extrahieren?