[問題] parsing的中文顯示

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

Links booklink

Contact Us: admin [ a t ] ucptt.com