看板 R_Language 關於我們 聯絡資訊
現在想要抓全家的網頁當作練習 用這個網站來做練習 http://www.i-write.idv.tw/life/info/familymart/familymart1.html 下面是我的程式碼 library(Rcurl) library(XML) library(httr) klist<-paste0("http://www.i-write.idv.tw/life/info/familymart/ familymart1-",1:7,".html") getURL(klist,encoding="UTF-8")->k htmlParse(k,encoding="UTF-8")->k readHTMLTable(k)->k1 k1[seq(3,length(k1),by=3)]->k2 這樣會得到一個完整的table沒錯,可是除了數字之外其他的都是詭異的亂碼 請問我在parsing的哪個過程需要做修正呢 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.175.238.8 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1466056948.A.67C.html
celestialgod: library什麼套件要寫... 06/16 14:41
※ 編輯: clansoda (1.175.238.8), 06/16/2016 15:02:07
clansoda: 已修改 06/16 15:02
celestialgod: 這裡只是windows顯示不出來UTF8的字元而已 06/16 15:26
celestialgod: 版上搜尋readHTMLTable 有一篇W大的解法 06/16 15:29
celestialgod: http://pastebin.com/QhCfqpr0 這是我的解法 06/16 15:34
celestialgod: 我是都用xml2硬幹... rvest的html_table都會失敗 06/16 15:34
celestialgod: 除非換去linux/mac才比較簡單的解法(攤手 06/16 15:34
celestialgod: 網頁編碼板上還有很多篇...可以都去看看 06/16 15:36
clansoda: 請問C大 pipeR的%>>% 跟dplyr的%>% 有哪裡不同嗎? 06/16 16:17
clansoda: 還有個問題是所謂的node是在html裡面的tag嗎? 06/16 16:28
clansoda: 我查看他的manual 卻不理解什麼是node 06/16 16:29
celestialgod: %>%是出自magrittr...不是dplyr 06/16 16:32
celestialgod: node就是xml的tag沒錯 06/16 16:32
celestialgod: 我不太用rvest,這裡可以用xml2的xml_find_all取代 06/16 16:33
celestialgod: 至於%>>%跟%>%的差異,網路上找一下pipeR作者的部落 06/16 16:34
celestialgod: 格吧 06/16 16:34
clansoda: 可是我的package沒有magrittr也可以用%>%耶 06/16 16:35
celestialgod: %>>%大多數支援%>%的寫法,不過有一些新功能還不錯 06/16 16:35
celestialgod: 用,也有比較好的速度 06/16 16:35
clansoda: 是depenceies的關係嗎 06/16 16:35
celestialgod: 因為dplyr會從magrittr import %>% 06/16 16:36
clansoda: 所以您比較推薦%>>% 這個用法嗎? 06/16 16:36
clansoda: 了解 所以是magrittr 才有%>% 06/16 16:36
celestialgod: dplyr是depend on magrittr沒錯 06/16 16:36
celestialgod: 我比較喜歡%>>% 06/16 16:37
clansoda: 那請想請教一下 GET %>% content這個部分 06/16 16:38
clansoda: 我GET以後看起來是一串LIST而不是html code 06/16 16:39
celestialgod: GET是送request,content是轉成xml_node, text或 ra 06/16 16:39
celestialgod: w的函數 06/16 16:39
clansoda: 然後content("raw") 是一連串成對的數字 這跟我過去用的 06/16 16:40
clansoda: getURL 所以抓下來的東西完全不同 06/16 16:41
clansoda: 所以GET是還沒抓下來的動作嗎? 抱歉因為之前很少做過 06/16 16:41
clansoda: 只用過ATTR來抓過資料 06/16 16:41
celestialgod: 這裡,我可能嘗試的時候沒刪掉,這裡直直接GET>>% 06/16 16:42
celestialgod: content %>>% html_nodes("table")N可以 06/16 16:42
celestialgod: 就可以 06/16 16:42
clansoda: 我看了一下那頁的HTML 共有三個</table> 06/16 16:48
clansoda: 所以走到這步的時候 這個LIST的三個ELEMENT就各是 06/16 16:48
clansoda: 這三個TABLE的html了是嘛 06/16 16:48
celestialgod: 三個table第一個table包了二三個table,第二個看起 06/16 16:49
celestialgod: 來是空的 06/16 16:49
celestialgod: 是的 06/16 16:49
clansoda: 那想請問 '[['(3) 這個用法我從來沒看過 看來是指抽出 06/16 16:50
clansoda: 第三個table 可是為什麼是這樣寫呢 06/16 16:50
clansoda: 感謝C大的講解,我有看懂這個pattern了 第二個table 06/16 16:51
clansoda: 看起來很小 好像是塞了圖片在裡面 06/16 16:52
celestialgod: '[['(3) 這樣寫是為了%>>% 06/16 16:56
celestialgod: list_obj[[3]]跟 '[['(list_obj, 3)是一樣的 06/16 16:56
celestialgod: pastebin做了一點修改,把rvest移除,全用xml2處理 06/16 16:59
clansoda: 所以'[['(3) 代表list 第三個element是嘛? 06/16 17:03
celestialgod: 對 06/16 17:03
clansoda: C大請問一下 你在xml_find_all 後面用了兩個table 06/16 17:10
clansoda: 我自己測//table 的寫法會跟html_nodes("table") 06/16 17:10
clansoda: 一樣,那為什麼寫兩個會變成只剩兩個table呢? 06/16 17:10
celestialgod: 前面有說,第一個table包了後兩個 06/16 17:11
celestialgod: 這裡的目標應該是第一個table的第二個 06/16 17:11
celestialgod: 所以我就只找table下的table 06/16 17:11
celestialgod: 這樣第一個table就不會包含進來了 06/16 17:12
clansoda: 喔喔 所以假如有三層 有一個超大的包中的再包小的 06/16 17:15
clansoda: 我的寫法就會變成xml_find_all("/table/table/talbe") 06/16 17:16
celestialgod: /跟//是不一樣的 /是下一層,//是中間隔好幾層 06/16 17:24
celestialgod: 如果三層應該通常正確是 table/tr/td/table/tr/td/. 06/16 17:25
celestialgod: 為了簡化 就會寫成 table//table//table 06/16 17:25
Wush978: 翻轉教室中的 02-RDataEngineer-02-XML 有R處理XML的教學 06/16 19:00
Wush978: 如果趕時間,可以看一下: http://0rz.tw/souVP 06/16 19:00
Wush978: 也許有幫助 06/16 19:00
celestialgod: wush一出手,便知有沒有 06/16 19:34
clansoda: wush大,我之前也有想要去看一下這個,但是我一裝 06/16 19:43
clansoda: 他就崩潰了 06/16 19:43
Wush978: 最近常常以人回報這個問題,好怪 06/16 20:10
Wush978: 你直接看網頁也可以 06/16 20:10
psinqoo: 如果要抓中文 還是用 LINUX 06/17 08:55
clansoda: linux不是要用指令嗎 我不太熟 06/17 10:23
clansoda: wush大 我可以用了 swirl 大概了解整個結構了 06/17 10:23
celestialgod: linux有桌面板 06/17 10:25
clansoda: C大可以請問一下 為什麼我在你用GET+content那邊用 06/17 11:24
clansoda: read_html的方式 不能得到一樣的答案呢? 06/17 11:24
clansoda: 如果我讀單一的頁面用read_html會得到head 跟body兩個 06/17 11:25
clansoda: 部分,但是用sapply以後會得到一個pointer開頭的東西 06/17 11:25
clansoda: 痾 沒事了,好像是我自己的問文 06/17 11:29
clansoda: 只是一開始好像會得到很多問號 06/17 11:30
clansoda: 我以為是錯的 06/17 11:30
celestialgod: GET %>>% content完就是xml_node的class 06/17 11:40
celestialgod: 不需要再read_html 06/17 11:40
celestialgod: 除非content用raw或是text才需要 06/17 11:40
clansoda: 我現在已經可以做到把td下面的文字弄成中文 06/17 12:03
clansoda: 但是要怎麼弄才能變成table或者dataframe呢 06/17 12:05
clansoda: 您的do.call(rbind)這個我一直弄不出來 06/17 12:06
celestialgod: %>>% do.call(what = rbind)這寫法只有%>>%可以用 06/17 12:17
celestialgod: 要用%>% 要改成 %>% do.call(rbind, .) 06/17 12:17
clansoda: 他會顯示 second argument must be a list 06/17 12:21
clansoda: 我已經用lapply 應該出來的結果會是list才對 06/17 12:22
clansoda: 我現在是將抓出來的character轉成matrix再轉成dataframe 06/17 12:22
clansoda: 雖然麻煩一點,但是用程式跑也只要寫一次就好了 06/17 12:23
celestialgod: 嗯? 你寫do.call(rbind)還是do.call(what=rbind) 06/17 12:29
celestialgod: 我這跑是都沒問題 06/17 12:29
celestialgod: 看你PIPE是用哪一個,寫法不一樣 06/17 12:30
clansoda: C大,我印象中有個function可以組合數列 06/17 15:41
clansoda: 例如 a=1:5 b=1:10 用了這個function 他會 1-1 1-2~1:10 06/17 15:42
clansoda: 2-1~2:10 我臨時找不到這個function叫做什麼 06/17 15:42
celestialgod: expand.grid? 06/17 15:55
clansoda: C大我有找到方法了 06/21 16:20
clansoda: 請問C大,這種網頁是不是完全爬不了 06/21 16:20
clansoda: 外面能爬的那個網頁,他大概有幾百個缺漏值,可能他後來 06/21 16:21
clansoda: 就不曾更新了,因此有些新開的他就沒加進去了 06/21 16:21
celestialgod: 沒有爬不了的網頁XD 晚一點再來研究 06/21 16:37
clansoda: 感謝,因為它是用aspx的檔案,我看不到他的資料寫在 06/21 16:39
clansoda: 哪一個NODE裏頭,所以我很難找出正確的寫法 06/21 16:39