[问题] 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