2015-05-04 24 views
2

我正在一個暑期項目上工作。從我的學校網站獲取課程信息。我想弄清楚如何解析一個網頁

我從這裏開始:http://www.uah.edu/cgi-bin/schedule.pl?file=fall2015.html&segment= 收集課程部門。

然後我從這個頁面抓取信息。 我有什麼,我需要過濾到一個列表,如:

[1] "91091 211 01  PRINC OF FINANCIAL ACCOUNTING  3.0 55 22  33 0 MW  12:45PM 02:05PM BAB 106  Rose-Green E" 
[2] "91092 211 02  PRINC OF FINANCIAL ACCOUNTING  3.0 53 18  35 0 TR  09:35AM 10:55AM BAB 123  STAFF"  
[3] "91093 211 03  PRINC OF FINANCIAL ACCOUNTING  3.0 48 29  19 0 TR  05:30PM 06:50PM BAB 220  Hoskins J" 
[4] "91094 212 01  MANAGEMENT ACCOUNTING    3.0 55 33  22 0 MWF  11:30AM 12:25PM BAB 106  Hoskins J" 
[5] "91095 212 02  MANAGEMENT ACCOUNTING    3.0 55 27  28 0 TR  02:20PM 03:40PM BAB 106  Bryson R" 

但是我的問題如下:

www.uah.edu/cgi-bin/schedule.pl?file=fall2015.html&segment=CS

我需要從每個URL添加的部門。在我給出的鏈接中,該部門是「CS」。我需要在每個條目中包含這些內容。

我需要變成一個表,或在哪裏可以指代相似的

               Max    Wait                              
    CRN Course  Title       Credit Enrl Enrl Avail List Days Start End  Bldg Room  Instructor                 
    ------ ---------- ------------------------------ ------ ---- ---- -------- ---- ------- ------- ------- ----- ---------- -------------------- 

數據一些其它物體基本上數據如何被顯示在頁面上。

所以我的最終目標是通過我抓住的每個鏈接,獲取所有課程信息(除了部分類型)。然後把它放到一個巨大的數據框中,它包含所有這樣的課程。

Department CRN Course  Title      Credit MaxEnrl Enrl Avail WaitList Days Start End  Bldg Room  Instructor 
ACC  91095 212 02  MANAGEMENT ACCOUNTING  3.0  55  27  28 0  TR  02:20PM 03:40PM BAB 106  Bryson R 

到目前爲止,我有這方面的工作

require(data.table) 
require(gdata) 
library(foreach) 

uah <- readLines('http://www.uah.edu/cgi-bin/schedule.pl?file=fall2015.html&segment=') 
uah <- substring(uah[grep('fall2015', uah)], 10) 
uah <- sub("\\\"(.*)", "", uah) 
uah <- paste("http://www.uah.edu" , uah , sep = "") 

gatherClasses <- function(url){ 

    dep <- readLines(url) 

    dep <- dep[grep('[[:digit:][:digit:][:digit:][:digit:]][[:digit:][:digit:][:digit:]] [[:digit:][:digit:]]', dep)] 

    dep <- substring(dep, 6) 

    dep <- foreach(i=dep) %do% i[grep('[[:digit:][:digit:][:digit:][:digit:]][[:digit:][:digit:][:digit:]] [[:digit:][:digit:]]', i)] 

    dep <- foreach(i=dep) %do% trim(i) 

    dep <- dep[2:length(dep)] 

    return(dep) 
} 

x <- gatherClasses(uah[1]) 
x <-unlist(x) 

我無法在正確的地方分割數據。我不確定接下來應該嘗試什麼。

編輯:(工作現在)

require(data.table) 
require(gdata) 
library(foreach) 

uah <- readLines('http://www.uah.edu/cgi-bin/schedule.pl?file=sum2015b.html&segment=') 
uah <- substring(uah[grep('sum2015b', uah)], 10) 
uah <- sub("\\\"(.*)", "", uah) 
uah <- paste("http://www.uah.edu" , uah , sep = "") 


gatherClasses <- function(url){ 

    L <- readLines(url) 
    Fields <- sub(" *$", " ", grep("---", L, value = TRUE)) 
    widths <- diff(c(0, gregexpr(" ", Fields)[[1]])) 
    Data <- grep("\\d{5} \\d{3}", L, value = TRUE) 
    classes <- read.fwf(textConnection(Data), widths, as.is = TRUE, strip.white = TRUE) 
    classes$department <- unlist(strsplit(url, '='))[3] 

    return(classes) 
} 

allClasses = foreach(i=uah) %do% gatherClasses(i) 
allClasses <- do.call("rbind", allClasses) 

write.table(mydata, "c:/sum2015b.txt", sep="\t") 

回答

5

讀線到L,搶"--- ---- etc."線到字段,並確保這正是有在一端的空間。找到空格的字符位置並區分它們以獲取字段寬度。最後用grep取出數據部分,並用read.fwf讀取它讀取固定寬度的字段。例如,對於藝術史:

URL <- "http://www.uah.edu/cgi-bin/schedule.pl?file=fall2015.html&segment=ARH" 
L <- readLines(URL) 
Fields <- sub(" *$", " ", grep("---", L, value = TRUE)) 
widths <- diff(c(0, gregexpr(" ", Fields)[[1]])) 
Data <- grep("\\d{5} \\d{3} \\d{2}", L, value = TRUE) 
read.fwf(textConnection(Data), widths, as.is = TRUE, strip.white = TRUE) 

,並提供:

V1 V2  V3       V4 V5 V6 V7 V8 V9 V10  V11  V12 V13 V14    V15 
1  90628 100 01 ARH SURV:ANCIENT-MEDIEVAL 3 35 27 8 0 TR 12:45PM 02:05PM WIL 168   Joyce L 
2  90630 101 01 ARH SURV:RENAISSANCE-MODERN 3 35 14 21 0 MW 12:45PM 02:05PM WIL 168   Stewart D 
3  90631 101 02 ARH SURV:RENAISSANCE-MODERN 3 35 8 27 0 MW 03:55PM 05:15PM WIL 168   Stewart D 
4  92269 101 03 ARH SURV:RENAISSANCE-MODERN 3 35 5 30 0 TR 11:10AM 12:30PM WIL 168 Shapiro Guanlao M 
5  90632 101 04 ARH SURV:RENAISSANCE-MODERN 3 35 13 22 0 TR 02:20PM 03:40PM WIL 168 Shapiro Guanlao M 
6  90633 301 01   ANCIENT GREEK ART 3 18 3 15 0 MW 02:20PM 03:40PM WIL 168   Joyce L 
7  92266 306 01 COLLAPSE OF CIVILIZATIONS 3 10 4 6 0 TR 12:45PM 02:05PM SST 205   Sever T 
8 W 90634 309 01 CONTEMPORARY ART & ISSUES 3 18 10 8 0 TR 09:35AM 10:55AM WIL 168   Stewart D 
9  90635 320 01  ST: MODERN ARCHITECTURE 3 12 0 12 0 TR 11:10AM 12:30PM WIL 172   Takacs T 
10 90636 400 01    SENIOR THESIS 3 0 0 0 0 TBA  TBA   TBA TBA   Joyce L 
11 90637 400 02    SENIOR THESIS 3 0 0 0 0 TBA  TBA   TBA TBA   Stewart D 
+0

使用破折號非常聰明。我會盡力記住未來的訣竅。另外,謝謝你讓我的正則表達式更好。我把我的最終版本放在我的帖子中,以防將來任何人需要它。 –

0

我寫了大約20年前捐了出來schedule.pl腳本,因爲他們只是發表的所有主要課程平板主機文件爲每個會議。劇本的工作是分解整個劇集並將其呈現在人類可消耗的區塊中。 (那時,那時候瀏覽器會淹沒那麼多的數據。)我從前任一個IT IT人員那裏瞭解到,他們試圖一次性去掉它,但是從用戶那裏得到了很大的歡迎和吶喊,所以他們想通了如何保持它的工作。

如果您不能檢索底層平面文件,向UAH IT人員詢問會更容易。它曾經是一個面向公衆的URL,但就像我說的那樣,大概是20年前的,所以我不記得具體情況。查看課程時看到的輸出與平面文件相同,但平面文件包含每個部門,因此您不必分別獲取每個部門。

相關問題