作者clansoda (小笨)
看板R_Language
标题[问题] parsing的中文显示
时间Thu Jun 16 14:02:23 2016
现在想要抓全家的网页当作练习
用这个网站来做练习
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://webptt.com/cn.aspx?n=bbs/R_Language/M.1466056948.A.67C.html
1F:→ celestialgod: library什麽套件要写... 06/16 14:41
※ 编辑: clansoda (1.175.238.8), 06/16/2016 15:02:07
2F:→ clansoda: 已修改 06/16 15:02
3F:→ celestialgod: 这里只是windows显示不出来UTF8的字元而已 06/16 15:26
4F:→ celestialgod: 版上搜寻readHTMLTable 有一篇W大的解法 06/16 15:29
6F:→ celestialgod: 我是都用xml2硬干... rvest的html_table都会失败 06/16 15:34
7F:→ celestialgod: 除非换去linux/mac才比较简单的解法(摊手 06/16 15:34
8F:→ celestialgod: 网页编码板上还有很多篇...可以都去看看 06/16 15:36
9F:→ clansoda: 请问C大 pipeR的%>>% 跟dplyr的%>% 有哪里不同吗? 06/16 16:17
10F:→ clansoda: 还有个问题是所谓的node是在html里面的tag吗? 06/16 16:28
11F:→ clansoda: 我查看他的manual 却不理解什麽是node 06/16 16:29
12F:→ celestialgod: %>%是出自magrittr...不是dplyr 06/16 16:32
13F:→ celestialgod: node就是xml的tag没错 06/16 16:32
14F:→ celestialgod: 我不太用rvest,这里可以用xml2的xml_find_all取代 06/16 16:33
15F:→ celestialgod: 至於%>>%跟%>%的差异,网路上找一下pipeR作者的部落 06/16 16:34
16F:→ celestialgod: 格吧 06/16 16:34
17F:→ clansoda: 可是我的package没有magrittr也可以用%>%耶 06/16 16:35
18F:→ celestialgod: %>>%大多数支援%>%的写法,不过有一些新功能还不错 06/16 16:35
19F:→ celestialgod: 用,也有比较好的速度 06/16 16:35
20F:→ clansoda: 是depenceies的关系吗 06/16 16:35
21F:→ celestialgod: 因为dplyr会从magrittr import %>% 06/16 16:36
22F:→ clansoda: 所以您比较推荐%>>% 这个用法吗? 06/16 16:36
23F:→ clansoda: 了解 所以是magrittr 才有%>% 06/16 16:36
24F:推 celestialgod: dplyr是depend on magrittr没错 06/16 16:36
25F:→ celestialgod: 我比较喜欢%>>% 06/16 16:37
26F:→ clansoda: 那请想请教一下 GET %>% content这个部分 06/16 16:38
27F:→ clansoda: 我GET以後看起来是一串LIST而不是html code 06/16 16:39
28F:→ celestialgod: GET是送request,content是转成xml_node, text或 ra 06/16 16:39
29F:→ celestialgod: w的函数 06/16 16:39
30F:→ clansoda: 然後content("raw") 是一连串成对的数字 这跟我过去用的 06/16 16:40
31F:→ clansoda: getURL 所以抓下来的东西完全不同 06/16 16:41
32F:→ clansoda: 所以GET是还没抓下来的动作吗? 抱歉因为之前很少做过 06/16 16:41
33F:→ clansoda: 只用过ATTR来抓过资料 06/16 16:41
34F:→ celestialgod: 这里,我可能尝试的时候没删掉,这里直直接GET>>% 06/16 16:42
35F:→ celestialgod: content %>>% html_nodes("table")N可以 06/16 16:42
36F:→ celestialgod: 就可以 06/16 16:42
37F:→ clansoda: 我看了一下那页的HTML 共有三个</table> 06/16 16:48
38F:→ clansoda: 所以走到这步的时候 这个LIST的三个ELEMENT就各是 06/16 16:48
39F:→ clansoda: 这三个TABLE的html了是嘛 06/16 16:48
40F:→ celestialgod: 三个table第一个table包了二三个table,第二个看起 06/16 16:49
41F:→ celestialgod: 来是空的 06/16 16:49
42F:→ celestialgod: 是的 06/16 16:49
43F:→ clansoda: 那想请问 '[['(3) 这个用法我从来没看过 看来是指抽出 06/16 16:50
44F:→ clansoda: 第三个table 可是为什麽是这样写呢 06/16 16:50
45F:→ clansoda: 感谢C大的讲解,我有看懂这个pattern了 第二个table 06/16 16:51
46F:→ clansoda: 看起来很小 好像是塞了图片在里面 06/16 16:52
47F:→ celestialgod: '[['(3) 这样写是为了%>>% 06/16 16:56
48F:→ celestialgod: list_obj[[3]]跟 '[['(list_obj, 3)是一样的 06/16 16:56
49F:→ celestialgod: pastebin做了一点修改,把rvest移除,全用xml2处理 06/16 16:59
50F:→ clansoda: 所以'[['(3) 代表list 第三个element是嘛? 06/16 17:03
51F:→ celestialgod: 对 06/16 17:03
52F:→ clansoda: C大请问一下 你在xml_find_all 後面用了两个table 06/16 17:10
53F:→ clansoda: 我自己测//table 的写法会跟html_nodes("table") 06/16 17:10
54F:→ clansoda: 一样,那为什麽写两个会变成只剩两个table呢? 06/16 17:10
55F:→ celestialgod: 前面有说,第一个table包了後两个 06/16 17:11
56F:→ celestialgod: 这里的目标应该是第一个table的第二个 06/16 17:11
57F:→ celestialgod: 所以我就只找table下的table 06/16 17:11
58F:→ celestialgod: 这样第一个table就不会包含进来了 06/16 17:12
59F:→ clansoda: 喔喔 所以假如有三层 有一个超大的包中的再包小的 06/16 17:15
60F:→ clansoda: 我的写法就会变成xml_find_all("/table/table/talbe") 06/16 17:16
61F:→ celestialgod: /跟//是不一样的 /是下一层,//是中间隔好几层 06/16 17:24
62F:→ celestialgod: 如果三层应该通常正确是 table/tr/td/table/tr/td/. 06/16 17:25
63F:→ celestialgod: 为了简化 就会写成 table//table//table 06/16 17:25
64F:→ Wush978: 翻转教室中的 02-RDataEngineer-02-XML 有R处理XML的教学 06/16 19:00
66F:→ Wush978: 也许有帮助 06/16 19:00
67F:→ celestialgod: wush一出手,便知有没有 06/16 19:34
68F:→ clansoda: wush大,我之前也有想要去看一下这个,但是我一装 06/16 19:43
69F:→ clansoda: 他就崩溃了 06/16 19:43
70F:→ Wush978: 最近常常以人回报这个问题,好怪 06/16 20:10
71F:推 Wush978: 你直接看网页也可以 06/16 20:10
72F:→ psinqoo: 如果要抓中文 还是用 LINUX 06/17 08:55
73F:→ clansoda: linux不是要用指令吗 我不太熟 06/17 10:23
74F:→ clansoda: wush大 我可以用了 swirl 大概了解整个结构了 06/17 10:23
75F:→ celestialgod: linux有桌面板 06/17 10:25
76F:→ clansoda: C大可以请问一下 为什麽我在你用GET+content那边用 06/17 11:24
77F:→ clansoda: read_html的方式 不能得到一样的答案呢? 06/17 11:24
78F:→ clansoda: 如果我读单一的页面用read_html会得到head 跟body两个 06/17 11:25
79F:→ clansoda: 部分,但是用sapply以後会得到一个pointer开头的东西 06/17 11:25
80F:→ clansoda: 痾 没事了,好像是我自己的问文 06/17 11:29
81F:→ clansoda: 只是一开始好像会得到很多问号 06/17 11:30
82F:→ clansoda: 我以为是错的 06/17 11:30
83F:→ celestialgod: GET %>>% content完就是xml_node的class 06/17 11:40
84F:→ celestialgod: 不需要再read_html 06/17 11:40
85F:→ celestialgod: 除非content用raw或是text才需要 06/17 11:40
86F:→ clansoda: 我现在已经可以做到把td下面的文字弄成中文 06/17 12:03
87F:→ clansoda: 但是要怎麽弄才能变成table或者dataframe呢 06/17 12:05
88F:→ clansoda: 您的do.call(rbind)这个我一直弄不出来 06/17 12:06
89F:→ celestialgod: %>>% do.call(what = rbind)这写法只有%>>%可以用 06/17 12:17
90F:→ celestialgod: 要用%>% 要改成 %>% do.call(rbind, .) 06/17 12:17
91F:→ clansoda: 他会显示 second argument must be a list 06/17 12:21
92F:→ clansoda: 我已经用lapply 应该出来的结果会是list才对 06/17 12:22
93F:→ clansoda: 我现在是将抓出来的character转成matrix再转成dataframe 06/17 12:22
94F:→ clansoda: 虽然麻烦一点,但是用程式跑也只要写一次就好了 06/17 12:23
95F:→ celestialgod: 嗯? 你写do.call(rbind)还是do.call(what=rbind) 06/17 12:29
96F:→ celestialgod: 我这跑是都没问题 06/17 12:29
97F:→ celestialgod: 看你PIPE是用哪一个,写法不一样 06/17 12:30
98F:→ clansoda: C大,我印象中有个function可以组合数列 06/17 15:41
99F:→ clansoda: 例如 a=1:5 b=1:10 用了这个function 他会 1-1 1-2~1:10 06/17 15:42
100F:→ clansoda: 2-1~2:10 我临时找不到这个function叫做什麽 06/17 15:42
101F:→ celestialgod: expand.grid? 06/17 15:55
102F:→ clansoda: C大我有找到方法了 06/21 16:20
103F:→ clansoda: 请问C大,这种网页是不是完全爬不了 06/21 16:20
105F:→ clansoda: 外面能爬的那个网页,他大概有几百个缺漏值,可能他後来 06/21 16:21
106F:→ clansoda: 就不曾更新了,因此有些新开的他就没加进去了 06/21 16:21
107F:→ celestialgod: 没有爬不了的网页XD 晚一点再来研究 06/21 16:37
108F:→ clansoda: 感谢,因为它是用aspx的档案,我看不到他的资料写在 06/21 16:39
109F:→ clansoda: 哪一个NODE里头,所以我很难找出正确的写法 06/21 16:39