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